欢迎来到天天文库
浏览记录
ID:37904612
大小:17.26 KB
页数:4页
时间:2019-06-02
《RSA加密算法的编程实现论文》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、RSA加密算法的编程实现论文RSA算法是在1978年由美国麻省理工学院三位密码学专家RonRivest、AdiShamir和LeonardAdleman发明的。RSA算法是一种典型的公开密钥体制算法,它的发明是对密码学的一个杰出贡献。RSA算法得到了世界上最广泛的应用,并在1992年被ISO国际标准化组织正式纳入国际标准[1][3]。与传统的对称密码算法相比,RSA算法最大贡献是为实现数字签名和数字证实提供了手段,为现代网络安全技术、电子商务、电子政务等打下了坚实的基础。RSA算法实现(1)在产生公开密钥
2、前先要选择两个不同的素数p、q,判断素数的方法很多,本程序判断素数的方法是:设n从3开始,每次增加2(排除偶数),除以≤的所有素数,如不存在被整除的数,则n为素数。(2)有了p、q值,就可以根据ψ(r)的值选择一个公开密钥pk,一般来说密钥长度越长安全性越好,但密钥的值应小于ψ(r)的值,否则不能正确求出私人密钥sk。程序中使用了欧几里德算法求出最大公约数:设有整数a、b,a>b>0,先令b为余数,a为除数,用每次余数为除数,去除以上次的除数,直到余数为0时,则上次的余数就是最大公约数。(3)已知整数a、
3、r,如果a·b≡1modr成立,也就是a·b的乘积被r除所得的余数等于1,用欧几里德扩展算法可以求出b。先令a作为余数,r作为上次除数,根据欧几里德算法,由数学归纳法可以证明出求a的乘逆b的递推公式如下:b-1=0,b=1b=
4、bj
5、其中j为整数,从1开始,qj是rj/aj的整数部分,当rj/aj的余数为1时,则a的乘逆b=
6、bj
7、。(4)加密、解密时,由于P=123456789值巨大,直接计算mamodr的值是很不方便的,使用“平方-乘算法”将极大地提高计算mamodr的速度。先将a转换为二进制数b,令
8、L为b的二进制位数,c=1,“平方-乘算法”伪码如下:FORI=L-1TO0DO{c=c·cmodr;IFbi=1THENc=c·mmodr;}则c就是mamodr的值,其中bi是b的第i位值。RAS算法举例下面我们举一个例子说明RAS加密和解密过程:(1)选素数,如选p=47,q=61。(2)计算公开模数r=p×q=4×61=2867。(3)计算欧拉函数k。(4)利用求最大公约数算法等,选择一个与ψ(r)互质的量k,可以选k=167,并令sk=k=167。(5)根据sk·pk≡1modψ(r),用求乘逆
9、算法求出pk=1223。这样我们就求出RSA算法3个关键值:r=2876,pk=1223,sk=167(6)加密时,假如明文P=123456789,可以将明文分成3组,即P1=123,P2=456,P3=789。用私人密钥sk加密时:C1=P1167modr=1770C2=P2167modr=1321C3=P3167modr=1297所以密文C=177013211297。(7)解密时,如用公开密钥pk解密时,只要计算:P1=C11223modr=123P2=C21223modr=456P3=C31223m
10、odr=789P=123456789这样,就将明文还原出来了。以下程序是java编写的实现RSA加密及解密的算法importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.NoSuchAlgorithmException;importjava.security.SecureRandom;importjava.security.interfaces.RSAPrivateKey;importjava.
11、security.interfaces.RSAPublicKey;importjavax.crypto.Cipher;//RSATest类即为测试类publicclassRSATest{//主函数publicstaticvoidmain(String[]args){try{RSATestencrypt=newRSATest();StringencryptText="encryptText";//输入的明文KeyPairkeyPair=encrypt.generateKey();//调用函数生成密钥对,函数
12、见下RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();byte[]e=encrypt.encrypt(publicKey,encryptText.getBytes());//调用自己编写的encrypt函数实现加密,byte[]de=encrypt
此文档下载收益归作者所有