因偶然的機會,幫學長去在js中找乙個函式的實現方式,於是費了些力氣幫他找到了函式的實現
rsa.setpublic(p,k);
var enkey = rsa.encrypt(njsessid);
要找的是setpublic和encrypt的實現方式,但實際上這兩個函式呼叫的是crypt.min,js
function rsasetpublic(b, a) else
}
function rsaencrypt(d)
var e=this.dopublic(a);
if(e==null)
var b=e.tostring(16);
if((b.length&1)==0)
else
}
雖然幫忙解決了問題,但我表示看不懂,所以就想寫個學習筆記來記錄下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
extend_eulid(b,a%b);
int temp=x;
x=y;
y=temp-a/b*y;
return ;
} public static void main(string args)
}
可以得到結果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是解密後得到的資訊
RSA加密演算法
素數是這樣的整數,它除了能表示為它自己和1的乘積以外,不能表示為任何其它兩個整數的乘積。例如,15 3 5,所以15不是素數 又如,12 6 2 4 3,所以12也不是素數。另一方面,13除了等於13 1以外,不能表示為其它任何兩個整數的乘積,所以13是乙個素數。素數也稱為 質數 二 什麼是 互質數...
RSA加密演算法
演算法的描述 1.選取兩個素數p,q 2.計算n p q,fn p 1 q 1 3.選擇乙個整數e,使得e與fn的最大公約數為1,e將會用於對資料進行加密。4.計算出乙個整數d,使得d e除fn的餘數為1。d用於對密文進行解密,還原出明文。5.假設明文為m,密文為c。如果需要對原文進行加密,則進行如...
RSA加密演算法
一 rsa是公鑰加密演算法之一,該演算法的數學基礎是 1 初等數論的euler定理,即 若整數a與整數n互素,則a n 1 mod n 其中,n 為尤拉函式。2 大整數分解很困難,即給定乙個大整數n,將其分解為n p q,兩個素數乘積十分困難。二 rsa基本原理 1 金鑰的生成。選擇大素數p,q,計...