**:
下面我以乙個簡單的例子來描述 rsa 演算法。
生成金鑰對,即公鑰和私鑰。
第一步:隨機找兩個質數 p 和 q ,p 與 q 越大,越安全。
比如 p = 67 ,q = 71。計算他們的乘積 n = p * q = 4757 ,轉化為二進為 1001010010101,該加密演算法即為 13 位,實際演算法是 1024 位 或 2048 位,位數越長,演算法越難被破解。
第二步:計算 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
第三步:隨機選擇乙個整數 e,條件是1< e < m,且 e 與 m 互質。
公約數只有 1 的兩個整數,叫做互質整數,這裡我們隨機選擇 e = 101
請注意不要選擇 4619,如果選這個,則公鑰和私鑰將變得相同。
第四步:有乙個整數 d,可以使得 e*d 除以 m 的餘數為 1。
即找乙個整數 d,使得 (e * d ) % m = 1。
等價於 e * d - 1 = y * m ( y 為整數)
找到 d ,實質就是對下面二元一次方程求解。
e * x - m * y =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,目前只能靠暴力破解,位數越長,暴力破解的時間越長。
加密生成密文 。
比如甲向乙傳送漢字「中」,就要使用乙的公鑰加密漢字 「中」, 以 utf-8 方式編碼為 [e4 b8 ad],轉為 10 進製為 [228,184,173]。要想使用公鑰(n,e) = (4757 , 101)加密,要求被加密的數字必須小於 n,被加密的數字必須是整數,字串可以取 ascii 值或unicode值,因此將「中」字折為三個位元組 [228,184,173],分別對三個位元組加密。
假設 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 為密文,則按下列公式計算出 a
a^d % n = b
密文 [4296,2458,3263]的明文如下:
4296^1601% 4757 = 228
2458^1601% 4757 = 184
3263^1601% 4757 = 173
即密文 [4296,2458,3263] 解密後得到 [228,184,173]
將[228,184,173] 再按 utf-8 解碼為漢字 「中」,至此解密完畢。
加密和解密的過程使用了費爾馬小定理的兩種等價的描述。
最後,問題來了,有沒有可能在已知 (n,e) 的情況下,推導出 d。
根據以上金鑰生成過程:
如果想知道 d 需要知道尤拉函式 φ(n)
如果想知道尤拉函式 φ(n) 需要知道 p 和 q
要知道 p 和 q 需要對 n 進行因數分解。
對於本例中的 4757 你可以輕鬆進行因數分解,但對於大整數的因數分解,是一件很困難的事情,目前除了暴力破解,還沒有更好的辦法,如果以目前的計算速度,破解需要50年以上,則這個演算法就是安全的
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,計...