6.1 密碼學專題 - 非對稱加密算法 - RSA 算法

密碼學專題 - 非對稱加密算法 - 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ù) pq。為了獲得最大程度的安全性,兩數(shù)的長度一樣。計算乘積:
n = pq

然后隨機選取加密密鑰 e,使 e(p-1)(q-1) 互素。最后用毆幾里得擴展算法計算解密密鑰 d,以滿足
ed \equiv 1 \ mod \ (p-1)(q-1)

d = e^{-1} \ mod \ (p-1)(q-1)

注意 dn 也互素。en 是公開密鑰,d 是私人密鑰。兩個素數(shù) pq 不再需要,它們應該被舍棄,但絕不可泄露。

加密消息 m 時,首先將它分成比 n 小的數(shù)據(jù)分組 (采用二進制數(shù),選取小于 n 的 2 的最大次冪)。也就是說,如果 pq 為 100 位的素數(shù),那么 n 將有 200 位,每個消息分組 m_i 應小于 200 位長 (如果你需要加密固定的消息分組,那么可以在它的左邊填充一些 0 并確保該數(shù)比 n 小)。加密后的密文 c,將由相同長度的分組 c_i 組成。加密公式簡化為:
c_i = m_i^e \ (mod \ n)

解密消息時,取每一個加密后的分組 c_i 并計算:
m_i = c_i^d \ (mod \ n)

由于
c_i^d = (m_i^e)^d = m_i^{ed} = m_i^{k(p-1)(q-1)+1} = m_i \times m_i^{k(p-1)(q-1)} = m_i \times 1 = m_i

全部 (mod \ n)。

這個公式能恢復出明文,總結見下表。

RSA 解密.jpg

消息用 d 加密就像用 e 解密一樣容易。這里不引入數(shù)論來證明這樣做為什么可行,現(xiàn)在的許多密碼學教材中都包括了這些細節(jié)。

舉一個簡單的例子可能更清楚地說明這一點。如果 p=47,q=71,那么:
n=pq=3337

加密密鑰 e 必須與 (p-1)(q-1)=46 \times 70=3220 沒有公因子。

隨機選取 e,如 79,那么:
d = 79^{-1} \ mod \ 3220 = 1019

該數(shù)用擴展的毆幾里得算法計算。公開 en,將 d 保密,丟棄 pq。

為了加密消息
m = 688232687966683

首先將其分成小的分組。在此例中,按 3 位數(shù)字一組就可以進行加密。這個消息將分成 6 個分組 m,進行加密:
m_1 = 688

m_2 = 232

m_3 = 687

m_4 = 966

m_5 = 668

m_6 = 003

第一個分組加密為:
688^{79} \ mod \ 3337 = 1570 = c_1

對隨后的分組進行同樣的運算產(chǎn)生加密后的密文:
c = 1570 \ 2756 \ 2091 \ 2276 \ 2423 \ 158

解密消息時需要用解密密鑰 1019 進行相同的指數(shù)運算。因而:
1570^{1019} \ (mod \ 3337) = 688 = m_1

消息的其余部分可用同樣的方法恢復出來。

Reference

項目源代碼

項目源代碼會逐步上傳到 Github,地址為 https://github.com/windstamp。

Contributor

  1. Windstamp, https://github.com/windstamp
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容