RSA加密算法java编程实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、RSA加密算法的原理
(1)、RSA算法描述
RSA公钥密码体制的基本原理:根据数论,寻求两个大素数比较简单,而将他们的乘积分解开则极为困难。
(2)、RSA算法密钥计算过程:
1.用户秘密选取两个大素数p 和q,计算n=pq,n称为
RSA算法的模数,公开。
2.计算出n的欧拉函数Φ(n) = (p-1)×(q-1),保密。
3.从(1, Φ(n))中随机地选择一个与Φ(n)互素的数e作为加
密密钥,公开。
4.计算出满足下式的d 作为解密密钥,保密。
ed=1 mod Φ(n)
(3)、RSA算法密钥:
加密密钥PK = |e, n| 公开
解密密钥SK = |d, n| 保密
(4)、RSA算法加密解密过程:
RSA算法属于分组密码,明文在加密前要进行分组,分组
的值m 要满足:0 < m < n
加密算法:C = E(m) ≡me mod n
解密算法:m = D(c) ≡cd mod n
(5)、RSA算法的几点说明:
1.对于RSA算法,相同的明文映射出相同的密文。
2.RSA算法的密钥长度:是指模数n的长度,即n的二进
制位数,而不是e或d的长度。
3.RSA的保密性基于大数进行因式分解很花时间,因此,
进行RSA加密时,应选足够长的密钥。512bit已被证明
不安全,1024bit也不保险。
4.RSA最快情况也比DES慢100倍,仅适合少量数据的加
密。公钥e取较小值的方案不安全。
二.RSA公钥加密算法的编程实现
以下程序是java编写的实现RSA加密及解密的算法
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import javax.crypto.Cipher;
//RSATest类即为测试类
public class RSATest {
//主函数
public static void main(String[] args) {
try {
RSATest encrypt = new RSATest();
String encryptText = "encryptText";//输入的明文
KeyPair keyPair = encrypt.generateKey();//调用函数生成密钥对,函数见下
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
byte[] e = encrypt.encrypt(publicKey, encryptText.getBytes());
//调用自己编写的encrypt函数实现加密,
byte[] de = encrypt.decrypt(privateKey, e);
//调用自己编写的decrypt函数实现解密,
System.out.println(toHexString(e)); //输出结果,采用ASSIC码形式
System.out.println(toHexString(de));
} catch (Exception e) {
e.printStackTrace();
}
}
// generateKey密钥对生成函数的实现
public KeyPair generateKey() throws NoSuchAlgorithmException { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); //返回生成指定算法的public/private 密钥对的KeyPairGenerator 对象。
keyPairGen.initialize(1024, new SecureRandom());
//使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器。
KeyPair keyPair = keyPairGen.generateKeyPair();//生成一个密钥对
return keyPair;
}
// encrypt加密函数
protected byte[] encrypt(RSAPublicKey publicKey, byte[] data) { if (publicKey != null) {
try {
Cipher cipher = Cipher.getInstance("RSA");
//返回实现指定转换的Cipher对象。
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//用密钥初始化此Cipher,第一个参数表示加密
return cipher.doFinal(data);
//按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此Cipher 的初始化方式)。
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
// decrypt解密函数
protected byte[] decrypt(RSAPrivateKey privateKey, byte[] raw) { if (privateKey != null) {
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey); //第一个参数表示解密
return cipher.doFinal(raw);
} catch (Exception e) {
e.printStackTrace();
}