基於私鑰加密公鑰解密的RSA演算法C 實現

2021-06-08 20:03:46 字數 2056 閱讀 9814

rsa演算法是第乙個能同時用於加密和數字簽名的演算法,也易於理解和操作。 rsa是被研究得最廣泛的公鑰演算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。rsa的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯rsa的難度與大數分解難度等價。

rsa的安全性依賴於大數分解。公鑰和私鑰都是兩個大素數( 大於 100個十進位制位)的函式。據猜測,從乙個金鑰和密文推斷出明文的難度等同於分解兩個大素數的積。 

金鑰對的產生。選擇兩個大素數,p 和q 。計算: 

n = p * q 

然後隨機選擇加密金鑰e(ps:最常用的e值有3,17和65537,微軟就是使用的65537,採用3個中的任何乙個都不存在安全問題),要求 e 和 ( p - 1 ) * ( q - 1 ) 互質。最後,利用euclid 演算法計算解密金鑰d, 滿足 

e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) ) 

其中n和d也要互質。數e和n是公鑰,d是私鑰。兩個素數p和q不再需要,應該丟棄,不要讓任何人知道。 

加密資訊 m(二進位制表示)時,首先把m分成等長資料塊 m1 ,m2,..., mi ,塊長s,其中 2^s <= n, s 盡可能的大。對應的密文是: 

ci = mi^e ( mod n ) ( a ) 

解密時作如下計算: 

mi = ci^d ( mod n ) ( b )

.net提供常用的加密演算法類,支援rsa的類是rsacryptoserviceprovider(命名空間:system.security.cryptography),但只支援公鑰加密,私鑰解密。rsacryptoserviceprovider類包括:modulus、exponent、p、q、dp、dq、inverseq、d等8個屬性,其中modulus和exponent就是公鑰,modulus和d就是私鑰,rsacryptoserviceprovider類提供匯出公鑰的方法,也提供匯出私鑰的方法,但匯出的私鑰包含上面8個屬性,顯然要用rsacryptoserviceprovider實現私鑰加密公鑰是不可行的。

從rsa的原理來看,公鑰加密私鑰解密和私鑰加密公鑰解密應該是等價的,在某些情況下,比如共享軟體加密,我們需要用私鑰加密註冊碼或註冊檔案,發給使用者,使用者用公鑰解密註冊碼或註冊檔案進行合法性驗證。

本人利用網上找的乙個c#版的大整數類biginteger(本人認為這是偶發現的效率最高的乙個c#版大整數類)來實現私鑰加密公鑰加密(事實上也完全支援公租加密私鑰解密),但沒有使用類biginteger的大素數生成函式,而是直接使用類rsacryptoserviceprovider來生成大素數。其中加密函式和解密函式的實現如下:

功能:用指定的私鑰(n,d)加密指定字串source 

*/private

string

encryptstring(

string

source, biginteger d, biginteger n) 

return

temp; 

} /*

功能:用指定的公鑰(n,e)解密指定字串source 

*/private

string

decryptstring(

string

source, biginteger e, biginteger n) 

return

temp; 

} 加密過程和解密過程**如下所示:

/*加密過程,其中d、n是rsacryptoserviceprovider生成的d、modulus 

*/private

string

encryptprocess(

string

source, 

string

d, string

n)  

/*解密過程,其中e、n是rsacryptoserviceprovider生成的exponent、modulus 

*/private

string

decryptprocess(

string

source, 

string

e, string

n)  

ZZ 基於私鑰加密公鑰解密的RSA演算法C 實現

rsa演算法是第乙個能同時用於加密和數字簽名的演算法,也易於理解和操作。rsa是被研究得最廣泛的公鑰演算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。rsa的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯rsa的難度與大數分解難度等價。r...

公鑰 私鑰 加密 解密 簽名 驗證

一 公鑰加密 假設一下,我找了兩個數字,乙個是1,乙個是2。我喜歡2這個數字,就保留起來,不告訴你們 私鑰 然後我告訴大家,1是我的公鑰。我有乙個檔案,不能讓別人看,我就用1加密了。別人找到了這個檔案,但是他不知道2就是解密的私鑰啊,所以他解不開,只有我可以用 數字2,就是我的私鑰,來解密。這樣我就...

php 公鑰加密 私鑰解密 私鑰加簽 公鑰驗籤

其中使用php函式可參考php openssl 公鑰加密 param data 加密資料 return mixed author xin.he date 2020 06 03 public function encryption data 公鑰加密 param data 加密資料 return mi...