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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章