RSA加密算法


因偶然的机会,帮学长去在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是解密后得到的信息


发布了73 篇原创文章 · 获赞 11 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章