Java函数:如何实现基于RSA算法的加密和解密?
概述:
RSA算法是一种非对称加密算法,被广泛应用于加密通信和数字签名领域。本题要求实现基于RSA算法的加密和解密,涉及到RSA算法的原理、公钥和私钥的生成、加密和解密的过程。本文将从这些方面逐一介绍。
RSA算法的原理:
RSA算法是基于大数分解问题的难度来实现加密。其核心原理是使用两个大质数p和q的乘积n为模数,通过选择合适的指数e和d,满足以下条件:
1. e和(p-1)(q-1)互质
2. (e * d) % (p-1)(q-1) = 1
其中,e是公开的加密指数,d是私有的解密指数。对于明文m,加密得到的密文c为:
c = m^e % n
对于密文c,解密得到明文m为:
m = c^d % n
公钥和私钥的生成:
RSA算法的安全性依赖于两个非常大的互质质数p和q,因此生成公钥和私钥的关键是生成这两个质数。一般采用如下步骤:
1.选择两个大质数p和q,计算n=p*q,?(n)=(p-1)*(q-1)
2.选择一个与?(n)互质的正整数e,满足1< e <?(n)
3.求解d,使得e * d ≡ 1(mod ?(n))
4.公钥为(n,e),私钥为(n,d)
Java实现:
首先定义一个RSAUtils类,其中包含以下方法:
/** * 生成公私钥对 * @param keySize 长度,1024、2048、3072、4096、8192等 * @return keyPair 公私钥对 */ public static KeyPair generateKeyPair(int keySize) /** * 加密 * @param publicKey 公钥 * @param plainBytes 明文byte数组 * @return cipherBytes 密文byte数组 */ public static byte[] encrypt(PublicKey publicKey, byte[] plainBytes) /** * 解密 * @param privateKey 私钥 * @param cipherBytes 密文byte数组 * @return plainBytes 明文byte数组 */ public static byte[] decrypt(PrivateKey privateKey, byte[] cipherBytes)
1. 生成公私钥对:
public static KeyPair generateKeyPair(int keySize) {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");//RSA算法
SecureRandom secureRandom = new SecureRandom();//随机数
keyPairGenerator.initialize(keySize, secureRandom);//设置长度和随机数
return keyPairGenerator.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
2. 加密
public static byte[] encrypt(PublicKey publicKey, byte[] plainBytes) {
try {
Cipher cipher = Cipher.getInstance("RSA");//RSA算法
cipher.init(Cipher.ENCRYPT_MODE, publicKey);//加密模式和公钥
return cipher.doFinal(plainBytes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
其中cipher.init(Cipher.ENCRYPT_MODE, publicKey)指定加密模式和公钥,doFinal方法返回密文byte数组。
3. 解密
public static byte[] decrypt(PrivateKey privateKey, byte[] cipherBytes) {
try {
Cipher cipher = Cipher.getInstance("RSA");//RSA算法
cipher.init(Cipher.DECRYPT_MODE, privateKey);//解密模式和私钥
return cipher.doFinal(cipherBytes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
其中cipher.init(Cipher.DECRYPT_MODE, privateKey)指定解密模式和私钥。
完整代码:
import javax.crypto.Cipher;
import java.security.*;
public class RSAUtils {
/**
* 生成公私钥对
*/
public static KeyPair generateKeyPair(int keySize) {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");//RSA算法
SecureRandom secureRandom = new SecureRandom();//随机数
keyPairGenerator.initialize(keySize, secureRandom);//设置长度和随机数
return keyPairGenerator.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
* 加密
*/
public static byte[] encrypt(PublicKey publicKey, byte[] plainBytes) {
try {
Cipher cipher = Cipher.getInstance("RSA");//RSA算法
cipher.init(Cipher.ENCRYPT_MODE, publicKey);//加密模式和公钥
return cipher.doFinal(plainBytes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解密
*/
public static byte[] decrypt(PrivateKey privateKey, byte[] cipherBytes) {
try {
Cipher cipher = Cipher.getInstance("RSA");//RSA算法
cipher.init(Cipher.DECRYPT_MODE, privateKey);//解密模式和私钥
return cipher.doFinal(cipherBytes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String plainText = "RSA算法测试";
int keySize = 1024;//密钥长度,单位bit
KeyPair keyPair = generateKeyPair(keySize);//生成公私钥对
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
byte[] plainBytes = plainText.getBytes();
byte[] cipherBytes = encrypt(publicKey, plainBytes);//加密明文
byte[] decryptedBytes = decrypt(privateKey, cipherBytes);//解密密文
String decryptedText = new String(decryptedBytes);
System.out.println("明文:" + plainText);
System.out.println("密文:" + new String(cipherBytes));
System.out.println("解密后明文:" + decryptedText);
}
}
注意事项:
1. 公钥和私钥需要严格保密,不可泄露。
2. 不可使用过于简单的质数,否则会导致加密的不安全。
3. RSA加密算法只适合加密较短的数据,一般使用RSA加密非常小的随机密码,然后再用这个密码加密数据,称为混合加密。
