因偶然的機會,幫學長去在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是解密後得到的信息