非对称加密:有两把密钥;使用公钥加密,必须使用私钥解密;或者使用私钥加密,必须使用公钥解密
加解密核心类: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);
}
}
欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感谢。如果觉得本文章有帮助到的,点个赞呗,让更多的阅读者看到