因偶然的机会,帮学长去在js中找一个函数的实现方式,于是费了些力气帮他找到了函数的实现
rsa.setPublic(p,k);
var enKey = rsa.encrypt(NJSESSID);
要找的是setPublic和encrypt的实现方式,但实际上这两个函数调用的是crypt.min,js
function RSASetPublic(b, a) {
if (b != null && a != null && b.length > 0 && a.length > 0) {
this.n = parseBigInt(b, 16);
this.e = parseInt(a, 16)
} else {
alert("Invalid RSA public key")
}
}
function RSAEncrypt(d){
var a=pkcs1pad2(d,(this.n.bitLength()+7)>>3);
if(a==null){return null}
var e=this.doPublic(a);
if(e==null){
return null
}
var b=e.toString(16);
if((b.length&1)==0)
{
return b
}
else
{
return"0"+b
}
}
虽然帮忙解决了问题,但我表示看不懂,所以就想写个学习笔记来记录下RSA.
1、RSA的简单介绍
RSA是非对称加密算法,那什么是对称加密算法,什么是非对称加密算法?
对称加密算法就是A使用一种规则对信息进行加密,B使用同样一种规则对信息进行解密,安全性并不好
而非对称加密算法,则是A生成两种不同的规则(即公钥和私钥),B使用A的公钥对信息加密,A使用自己的私钥对信息解密,公钥大家公有的,比如C也想给A传信息,就可以用A的公钥对信息加密,发送给A,而B因为没有A的私钥,看不了C发给A的信息
——图片摘自百度百科
2、RSA需要用到的数学工具
(1)互质
两个数只有1作为公因子,没有其他公因子。如11和20
(2)欧拉函数
小于n的正整数中与n互质的个数,求个数的方法就叫欧拉函数
(3)模反元素
如果两个元素a和n互质,则一定存在一个数b使得a*b-1被n整除,或者说a*b除以n余1,则b叫做a的模反元素
3、密钥是如何生成的?
第一步:随机产生两个不相等的质数p和q
第二步:计算p和q的乘积n
第三步:计算n的欧拉函数f(n)
即 n =(p-1)×(q-1)
欧拉函数f(n)
第四步:选择一个整数e,是e大于1小于f(n)
第五步:计算e对于f(n)的模反元素d
第六步:将(n,e)封装成公钥,将(n,d)封装成私钥,一旦d泄漏,就等于私钥泄密
实际计算的例子
S1: p=11,q=20
S2: n=p*q=220
S3: f(220)=10*19=190
S4: e=23
S5; 23*d -1 = k*190 等价于 23*x + 190y = 1
写一个小的程序,使用扩展欧几里德算法来计算出x和y的值
public class Euclid {
private static int x,y,q;
public static void extend_Eulid(int a,int b){
if(b==0){
x=1;y=0;q=a;
return;
}
extend_Eulid(b,a%b);
int temp=x;
x=y;
y=temp-a/b*y;
return ;
}
public static void main(String[] args) {
int a=23,b=190;
extend_Eulid(a,b);
System.out.printf("%d=(%d)*%d+(%d)*%d\n",q,x,a,y,b);
}
}
可以得到结果1=(-33)*23+(4)*190
S6、n=220,e=23,d=-33
公钥(n,e) 就是(220,23)
私钥(n,d)就是(220,-33)
关于加密解密那里,需要用到幂模运算(使用蒙哥马利算法),可以来验证公钥和私钥的正确性。
4、既然有了公钥和私钥,如何加密与解密?
(1)加密
对信息m加密,使用
m的e次方 = c(mod)n
c则是加密后的信息
(2)解密
c的d次方 = m (mod)n
m是解密后得到的信息