RSA加密整理

2021-10-04 02:15:23 字數 3524 閱讀 9365

rsa是什麼:

rsa加密演算法是一種非對稱加密演算法

核心:對兩個質數相乘容易,而將其合數分解很難的這個特點進行的加密演算法;

n=p1*p2,已知p1、p2求n簡單,已知n求p1、p2困難。

(m^e) mod n=c,已知m、e、n求c簡單,已知e、n、c求m很難

rsa加密實現了公開金鑰,非對稱加密才能有這種特點;

對稱加密演算法:加密和解密使用同一套規則。例如:甲使用規則(金鑰)a加密明文後傳遞給乙,乙通過規則a的逆運算完成密文解密,得到明文;

非對稱加密演算法:可以在不傳遞金鑰的情況下,完成解密。假如甲要和乙通訊,甲使用公鑰 a 加密,將密文傳遞給乙,乙使用私鑰 b 解密得到明文。其中公鑰在網路上傳遞,私鑰只有乙自己擁有,不在網路上傳遞,這樣即使知道了公鑰 a 也無法解密。這被稱為 diffie-hellman金鑰交換演算法

rsa演算法過程(參考):

第一步,生成金鑰對,即公鑰和私鑰;

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 請注意不要選擇 4619,如果選這個,則公鑰和私鑰將變得相同。

4.有乙個整數 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、unicode)轉化為數字。

中—utf8 [e4 b8 ad]- --10 進製為 [228,184,173]

使用公鑰 (n,e) = (4757 , 101)加密;

a 為明文,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]

乙用私鑰對密文進行解密,

解密公式如下: a 為明文,b 為密文,則按下列公式計算

b^d % n = a

密文 [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 解碼為漢字 「中」,至此解密完畢。

術語、公式、變數整理:

p、q:兩個非常大的質數:

n:p和q的乘積,n=pq;

m:n尤拉函式,因為n=pq,且p、q為質數,所以m=n=(p-1)*(q-1);

e : 條件:是1< e < m,且 e 與 m 互質,隨機選取乙個符合條件的e值;

d: 尋找乙個整數d,滿足:(e * d )% m = 1

公鑰:(n,e)

私鑰:(n,d)

公鑰加密方式:a^e % n = b

私鑰解密方式:b^d % n = a

尤拉函式 φ(n):表示在小於等於 n 的正整數之中,與 n 構成互質關係的數的個數

e是可以隨機選取的,但是在應用中時常選擇e=65537

問題:從公鑰推出私鑰有沒有可能?

回顧上面的金鑰生成步驟,一共出現六個數字:pq

nm= φ(n)ed

那麼已知,n、e是否能推出d?

過程如下:

d的產生過程如下,

(e * d )% m = 1

現知道e,要想知道d,必先知道m,

m=φ(n)=(p-1)*(q-1)

故,如何知道p、q則能知道d的值,

得到pq的唯一辦法:對n進行因數分解;

大整數的因數分解,是一件非常困難的事情。目前,除了暴力破解,還沒有發現別的有效方法,此保證了該rsa演算法的可靠性

私鑰解密的證明

因為私鑰解密的過程並不是公鑰加密的逆過程,那麼,必須證明我們用這樣的私鑰進行解密,得到的m為什麼是正確的;

證明過程

實際使用時,為什麼生成的公鑰和私鑰分別都是乙個字串文字,乙個文字是以什麼格式儲存兩個數字的資訊的?

實際使用時,為什麼同樣的明文會加密得到不同的密文?

mysql rsa加密 rsa加密

rsa演算法類 簽名及密文編碼 base64字串 十六進製制字串 二進位制字串流 填充方式 pkcs1padding 加解密 nopadding 解密 notice only accepts a single block.block size is equal to the rsa key size...

RSA 加密檔案

獲取金鑰和公鑰 public void rsakey out string xmlkeys,out string xmlpublickey catch exception ex rsa的加密函式 public string rsaencrypt string xmlpublickey,string ...

RSA 加密檔案

獲取金鑰和公鑰 public void rsakey out string xmlkeys,out string xmlpublickey catch exception ex rsa的加密函式 public string rsaencrypt string xmlpublickey,string ...