測試產品的時候,對簽名跟認證很是熟悉。但是對RSA的原理,以及秘鑰的關系還是有原理性方面的欠缺。
本文梳理下RSA的加解密流程,以及秘鑰的對應關系
關於RSA的認證跟加密的應用,采用如下的方式
認證:私鑰簽名,公鑰認證
加密:公鑰加密,私鑰解密
RSA算法流程
RSA算法的的原理簡單來說就是將一個很大的質數M,很難分解為兩個質數a,b,並且a*b=M
詳解請參照:
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
-
生成秘鑰
- 選擇兩個不相等的質數p,q
- 計算p,q的乘積n
- 計算n的歐拉函數φ(n)=(p-1)*(q-1),計算出來的值就是不大於n且與n互質的整數個數
- 選擇一個與φ(n)互質的整數e,且1<e<φ(n)
- 計算e對於φ(n)的模反元素d,計算公式d*e≡1(mod(n))。
- 公鑰(n,e),私鑰(n,d)。
- 銷毀p,q
-
加解密
- 加密
- 發送方向接收方發送明文信息m,發送方使用公鑰(n,e)依照如下公式加密:
m^e=c(mod n)
m必須是整數,且小於n。根據上面的公式可以算出密文C
- 發送方向接收方發送明文信息m,發送方使用公鑰(n,e)依照如下公式加密:
- 解密
- 接收方獲取密文c,使用自己的私鑰(n,d)依照如下公式解密
c^d=m(mod n)
c,d,n已知,可以算出明文m
- 接收方獲取密文c,使用自己的私鑰(n,d)依照如下公式解密
- 加密
從上面的秘鑰生成流程中,我們可以發現
如果p,q都銷毀了,很難通過公鑰(n,e)獲取私鑰(n,d).反之亦然。以為公式中的φ(n)=(p-1)(q-1),通過n很難得到p,q是本算法的基礎
但是通常我們使用的tool生成的私鑰中,包含了公鑰信息。所以可以通過私鑰獲取公鑰
示例
1. 隨機選擇兩個不相等的質數47和59
2. 二者的乘積為43×57=2773,2773轉化為二進制為1010,1101,0101,長度為12位,所以密鑰的長度為12位
3. 根據歐拉函數公式φ(n)=n(1-1/p)(1-1/q)計算,φ(2773)= 2773×(1-1/47)(1-1/59)=(47-1)(59-1)=2668
4. 隨機選擇一個整數e=63,2668>63>1,並且63與2668互質
5. 計算63對於2668的模反元素d,根據公式ed≡1(mod φ(n)),有63d-1=2668k,由歐幾里得擴展公式計算d=847
6. 公鑰(n,e)=(2773,63),私鑰(n,d)=(2773,847)
- 加密
根據上面計算出的公鑰(n,e)=(2773,63),假如m=244,根據公式m^e=c(mod n),可計算出密文c=465 - 解密
根據上面計算出的私鑰(n,d)=(2773,847),已知c=465,根據公式c^d=m(mod n),可計算出明文m=244
