文章目录
一、RSA简介
RSA是一种常用的非对称加密算法,所谓非对称加密是指使用一对密钥(公钥和私钥)进行加密和解密,公钥人人都可以获得,用于加密数据,私钥保存在服务器中,用于解密数据。加密解密过程如下:
使用RSA进行加密解密,其优点是非常不容易破解,缺点是和对称加密(如AES)相比,加密速度较慢。因此,实际使用中,常常将对称加密和非对称加密结合使用,即使用非对称加密协商对称加密的密钥,使用对称加密密钥加密传输内容。
二、RSA 原理介绍
RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困 难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有
三、RSA 秘钥对生成
1. 密钥对生成
private static KeyPair genKeyPair() {
try {
KeyPairGenerator keyPairGen = null;
keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048, new SecureRandom());
return keyPairGen.generateKeyPair();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
2. 获取公钥
public static PublicKey getPublicKey(KeyPair keyPair){
return keyPair.getPublic();
}
3. 获取私钥
public static PrivateKey getPrivateKey(KeyPair keyPair){
return keyPair.getPrivate();
}
四、PublicKey 和PrivateKey 的保存
1. 获取公钥十六进制字符串
public static String getHexStrPublicKey(PublicKey publicKey){
byte[] publicKeyEncoded = publicKey.getEncoded();
return ConvectionUtils.byte2HexStr(publicKeyEncoded);
}
1. 获取私钥十六进制字符串
public static String getHexStrPrivateKey(PrivateKey privateKey){
byte[] privateKeyEncoded = privateKey.getEncoded();
return ConvectionUtils.byte2HexStr(privateKeyEncoded);
}
五、PublicKey 和 PrivateKey 加载
1. 加载公钥
public static PublicKey loadPublicKey(String publicKeyStr) throws Exception {
try {
byte[] buffer = ConvectionUtils.hexStr2Bytes(publicKeyStr);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
return keyFactory.generatePublic(keySpec);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
2. 加载私钥
public static PrivateKey loadPrivateKey(String privateKeyStr) throws Exception {
try {
byte[] buffer =ConvectionUtils.hexStr2Bytes(privateKeyStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(keySpec);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
六、 RSA加解密
1. RSA 支持三种加密方式
- RSA/ECB/PKCS1Padding (1024, 2048)
- RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
- RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
’
2.RSA加密
public static byte[] encrypt(PublicKey publicKey, byte[] plainTextData) {
if (publicKey == null || plainTextData == null) {
return null;
}
Cipher cipher;
try {
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(plainTextData);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
3. RSA解密
public static byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData) {
if (privateKey == null || cipherData == null) {
return null;
}
Cipher cipher = null;
try {
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(cipherData);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}