密碼學專題 - 非對稱加密算法 - RSA 算法
6.1 RSA 算法
第一個較完善的非對稱加密算法 RSA,它既能用于加密也能用于數(shù)字簽名。在已提出的非對稱加密算法中,RSA 是最容易理解和實現(xiàn)的。這個算法也是最流行的。RSA 以它的三個發(fā)明者 Ron Rivest、Adi Shamir 和 Leonard Adleman 的名字命名。該算法已經(jīng)經(jīng)受住了多年深入的密碼分析。雖然密碼分析者既不能證明也不能否定 RSA 的安全性,但這恰恰說明該算法有一定的可信度。
RSA 的安全基于大數(shù)分解的難度。其公開密鑰和私人密鑰是一對大素數(shù) (100 ~ 200 個十進制數(shù)或更大) 的函數(shù)。從一個公開密鑰和密文中恢復出明文的難度等價于分解兩個大素數(shù)之積。
為了產(chǎn)生兩個密鑰,選取兩個大素數(shù) 和
。為了獲得最大程度的安全性,兩數(shù)的長度一樣。計算乘積:
然后隨機選取加密密鑰 ,使
和
互素。最后用毆幾里得擴展算法計算解密密鑰
,以滿足
則
注意 和
也互素。
和
是公開密鑰,
是私人密鑰。兩個素數(shù)
和
不再需要,它們應該被舍棄,但絕不可泄露。
加密消息 時,首先將它分成比
小的數(shù)據(jù)分組 (采用二進制數(shù),選取小于
的 2 的最大次冪)。也就是說,如果
和
為 100 位的素數(shù),那么
將有 200 位,每個消息分組
應小于 200 位長 (如果你需要加密固定的消息分組,那么可以在它的左邊填充一些 0 并確保該數(shù)比
小)。加密后的密文
,將由相同長度的分組
組成。加密公式簡化為:
解密消息時,取每一個加密后的分組 并計算:
由于
全部 。
這個公式能恢復出明文,總結見下表。

消息用 加密就像用
解密一樣容易。這里不引入數(shù)論來證明這樣做為什么可行,現(xiàn)在的許多密碼學教材中都包括了這些細節(jié)。
舉一個簡單的例子可能更清楚地說明這一點。如果 ,那么:
加密密鑰 必須與
沒有公因子。
隨機選取 ,如 79,那么:
該數(shù)用擴展的毆幾里得算法計算。公開 和
,將
保密,丟棄
和
。
為了加密消息
首先將其分成小的分組。在此例中,按 3 位數(shù)字一組就可以進行加密。這個消息將分成 6 個分組 ,進行加密:
第一個分組加密為:
對隨后的分組進行同樣的運算產(chǎn)生加密后的密文:
解密消息時需要用解密密鑰 1019 進行相同的指數(shù)運算。因而:
消息的其余部分可用同樣的方法恢復出來。
Reference
- RSA: A SIMPLE AND EASY-TO-READ IMPLEMENTATION (PYTHON RECIPE), http://code.activestate.com/recipes/578838-rsa-a-simple-and-easy-to-read-implementation/
項目源代碼
項目源代碼會逐步上傳到 Github,地址為 https://github.com/windstamp。
Contributor
- Windstamp, https://github.com/windstamp