密鑰生成的步驟
第一步:生成密鑰對,即公鑰和私鑰。
1:隨機找兩個質數 P 和 Q ,P 與 Q 越大,越安全
比如 P = 67 ,Q = 71。計算他們的乘積 n = P * Q = 4757 ,轉化為二進為 1001010010101,該加密算法即為 13 位,實際算法是 1024 位 或 2048 位,位數越長,算法越難被破解。
2:計算 n 的歐拉函數 φ(n)。
φ(n) 表示在小於等於 n 的正整數之中,與 n 構成互質關系的數的個數。例如:在 1 到 8 之中,與 8 形成互質關系的是1、3、5、7,所以 φ(n) = 4。
如果 n = P * Q,P 與 Q 均為質數,則 φ(n) = φ(P * Q)= φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1) 。
本例中 φ(n) = 66 * 70 = 4620,這里記為 m, m = φ(n) = 4620
3:隨機選擇一個整數 e,條件是1< e < m,且 e 與 m 互質
公約數只有 1 的兩個整數,叫做互質整數,這里我們隨機選擇 e = 101 (實際應用中,常常選擇65537。)
4:計算出一個整數 d,可以使得 e*d 除以 m 的余數為 1
這個式子等價於 ed - 1 = km
於是,找到整數d,實質上就是對下面這個二元一次方程求解:
ex+my=1
已知 e = 101 m = 4620,即:101x+4620y=1;
這個方程可以用"擴展歐幾里得算法"求解,此處省略具體過程。 總之算出一組整數解(x,y )= ( 1601,35),即 d = 1601。 到此密鑰對生成完畢。不同的 e 生成不同的 d,因此可以生成多個密鑰對。
本例中公鑰為 (n,e) = (4757 , 101),私鑰為 (n,d) = (4757 ,1601) ,僅(n,e) = (4757 , 101) 是公開的,其余數字均不公開。可以想像如果只有 n 和 e,如何推導出 d,目前只能靠暴力破解,位數越長,暴力破解的時間越長。
第二步:加密生成密文
要想使用公鑰(n,e) = (4757 , 101)加密,要求被加密的數字必須小於 n,被加密的數字必須是整數,字符串可以取 ascii 值或unicode值。
假設 a 為明文,b 為密文,則按下列公式計算出 b
a^e % n = b
計算 [228,184,173]的密文:
228^101 % 4757 = 4296
184^101 % 4757 = 2458
173^101 % 4757 = 3263
即 [228,184,173]加密后得到密文 [4296,2458,3263] ,如果沒有私鑰 d ,神仙也無法從 [4296,2458,3263]中恢復 [228,184,173]。
第三步:解密生成明文
乙收到密文 [4296,2458,3263],並用自己的私鑰(n,d) = (4757 ,1601) 解密。解密公式如下: 假設 a 為密文,b 為明文,則按下列公式計算出 b
a^d % n = b
密文 [4296,2458,3263]的明文如下:
4296^1601% 4757 = 228
2458^1601% 4757 = 184
3263^1601% 4757 = 173
參考文檔:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html