Bootstrap

Java代码实现非对称加密RSA算法示例

非对称加密:有两把密钥;使用公钥加密,必须使用私钥解密;或者使用私钥加密,必须使用公钥解密

加解密核心类:Cipher

下面代码是使用RSA算法加解密的一个示例,实现过程包括:生成密钥对,把公钥和私钥保存到文件中,读取公钥和私钥,对明文进行加密和解密。代码中都有详细的注释,如果代码中有哪些地方没看明白的,可以直接评论

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;

public class AsymmetricEncryption {

	public static void main(String[] args) throws Exception{
		String input="巅峰小苏";//需要加密的数据
		String algorithm="RSA";//加密算法
		//生成密钥对并保存在本地文件中
		generateKeyToFile(algorithm,"a.pub","a.pri");
		//读取私钥
		PrivateKey privateKey = getPrivateKey("a.pri", algorithm);
		//读取公钥
		PublicKey publicKey = getPublicKey("a.pub", algorithm);
		//加密
		String en=encryptRSA(algorithm, privateKey, input);
		System.out.println("加密:"+en);
		//解密
		String de=decryptRSA(algorithm, publicKey, en);
		System.out.println("解密:"+de);
	}
	
	/**
	 * 私钥加密
	 * @param algorithm 算法
	 * @param privateKey 私钥
	 * @param input  原文
	 * @return
	 * @throws Exception
	 */
	public static String encryptRSA(String algorithm,Key privateKey,String input)throws Exception{
		//创建加密对象
		Cipher cipher=Cipher.getInstance(algorithm);
		//对加密进行初始化,第一个参数是:加密的模式
		//第二个参数是:你想使用公钥加密还是私钥加密,这里使用的是私钥加密
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		byte[] bytes=cipher.doFinal(input.getBytes());
		return Base64.encodeBase64String(bytes);
	}
	/**
	 * 公钥解密
	 * @param algorithm 算法
	 * @param publickey 公钥
	 * @param encrypted 密文
	 * @return
	 * @throws Exception
	 */
	public static String decryptRSA(String algorithm,Key publickey,String encrypted)throws Exception{
		Cipher cipher=Cipher.getInstance(algorithm);
		//注意:如果使用公钥加密就必须使用私钥解密,使用私钥加密就必须使用公钥解密,否则会出现异常
		cipher.init(Cipher.DECRYPT_MODE, publickey);
		//把base64密文转回字节数组
		byte[] decode=Base64.decodeBase64(encrypted);
		byte[] bytes1=cipher.doFinal(decode);
		//这里要用new String()转字符串,不能用.toString()方法,否则返回的是哈希值
		return new String(bytes1);
	}
	/**
	 * 把公钥和私钥保存到根目录
	 * @param algorithm 算法
	 * @param pubPath	公钥路径
	 * @param priPath	私钥路径
	 * @throws NoSuchAlgorithmException
	 * @throws IOException
	 */
	private static void generateKeyToFile(String algorithm,String pubPath,String priPath) throws NoSuchAlgorithmException, IOException {
		// 密钥对生成器对象
		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
		// 初始化密钥长度
		keyPairGenerator.initialize(1024);
		// 生成密钥对
		KeyPair keyPair = keyPairGenerator.generateKeyPair();
		// 生成私钥
		PrivateKey privateKey = keyPair.getPrivate();
		// 获取私钥的字节数组
		byte[] privateKeyEncoded = privateKey.getEncoded();
		// 使用base64进行编码
		String privateEncodeString = Base64.encodeBase64String(privateKeyEncoded);
		System.out.println("私钥:" + privateEncodeString);
		// 生成公钥
		PublicKey publicKey = keyPair.getPublic();
		// 获取公钥的字节数组
		byte[] publicKeyEncoded = publicKey.getEncoded();
		// 使用base64进行编码
		String publicEncodeString = Base64.encodeBase64String(publicKeyEncoded);
		System.out.println("公钥:" + publicEncodeString);
		//把公钥和私钥保存到根目录
		FileUtils.writeStringToFile(new File(pubPath), publicEncodeString,Charset.forName("UTF-8"));
		FileUtils.writeStringToFile(new File(priPath), privateEncodeString,Charset.forName("UTF-8"));
	}
	/**
	 * 读取私钥
	 * @param priPath 私钥的路径
	 * @param algorithm 算法
	 * @return
	 * @throws Exception 返回私钥的key对象
	 */
	private static PrivateKey getPrivateKey(String priPath,String algorithm) throws Exception{
		String privateKeyString=FileUtils.readFileToString(new File(priPath),Charset.defaultCharset());
		//创建key的工厂
		KeyFactory keyFactory=KeyFactory.getInstance(algorithm);
		//创建私钥key的规则
		PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
		//返回私钥对象
		return keyFactory.generatePrivate(keySpec);
	}
	
	/**
	 * 读取公钥
	 * @param priPath 公钥的路径
	 * @param algorithm 算法
	 * @return
	 * @throws Exception 返回公钥的key对象
	 */
	private static PublicKey getPublicKey(String publicPath,String algorithm) throws Exception{
		String publicKeyString=FileUtils.readFileToString(new File(publicPath),Charset.defaultCharset());
		//创建key的工厂
		KeyFactory keyFactory=KeyFactory.getInstance(algorithm);
		//创建公钥key的规则
		X509EncodedKeySpec keySpec=new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
		//返回公钥对象
		return keyFactory.generatePublic(keySpec);
		
	}
}

欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感谢。如果觉得本文章有帮助到的,点个赞呗,让更多的阅读者看到

;