利用RSA證書給數(shù)據(jù)加解密

在RSA加密算法的描述中,利用makecert工具生成的MyTestCert證書舉行加密解密,這個(gè)證書具有RSA算法1024位的密鑰。

RSA加密解密過(guò)程如下:

1、生成RSA證書、發(fā)放證書

RSA證書利用makecert工具生成的MyTestCert,當(dāng)然也能夠是從商業(yè)CA獲得的證書,你獲得的證書應(yīng)當(dāng)是含有公鑰和私鑰的全面證書。要接逝步柢數(shù)據(jù),必需把你的公鑰發(fā)放給加密數(shù)據(jù)的加密方,加密方利用你的公鑰加密數(shù)據(jù)。證書要么以pfx形式存在,要么被導(dǎo)入到證書存儲(chǔ)區(qū)。

萬(wàn)一你的RSA證書存在于證書存儲(chǔ)區(qū)能夠穿越證書管教扼制臺(tái)供給的證書導(dǎo)出功能導(dǎo)出只含有公鑰的cer證書,如果證書以pfx證書文件形式存在,能夠穿越代碼讀取證書然后導(dǎo)出為只含公鑰的cer證書。

2、 字符串明文轉(zhuǎn)成某一代碼頁(yè)對(duì)應(yīng)的編碼字節(jié)流

待加密的數(shù)據(jù)可能有兩種形式,一種是二進(jìn)制的數(shù)據(jù),本身即便一組字節(jié)流,這么的數(shù)據(jù)能夠跳過(guò)這一步,直接進(jìn)去加密環(huán)節(jié)。還有一種情形是字符串?dāng)?shù)據(jù),字符串中同樣的字符利用不同的代碼頁(yè)會(huì)生成不同的字節(jié)碼,因而從字符串到字節(jié)流的轉(zhuǎn)換是必需指定利用何種編碼的。在解密后,要從字節(jié)流通換到字符串即將利用雷同的代碼頁(yè)解碼,否則就會(huì)揭示亂碼。

//保留明文文件的字節(jié)數(shù)組

Byte[] plainTextByte = Encoding.UTF8.GetBytes(&ldquohttp://www.9tishop.info/lianxiwomen/545.htmlhttp://www.damuge.info/gongsi/627.html;RSA證書對(duì)敏感數(shù)據(jù)舉行加密http://www.myfo4.info/lianxiwomen/627.html!”);

這里用utf8代碼頁(yè)對(duì)明文舉行編碼,把明文字符串轉(zhuǎn)成字節(jié)流。

3、 加密壟斷

//從只包括公鑰的證書文件載入證書

X509Certificate2 myX509Certificate2 = new X509Certificate2(@"C:/Samples/PartnerAEncryptMsg/MyTestCert.cer");

//從cer證書中獲得含公鑰的RSACryptoServiceProvider

RSACryptoServiceProvider myRSACryptoServiceProvider = (RSACryptoServiceProvider)myX509Certificate2.PublicKey.Key;

//利用RSACryptoServiceProvider把明文字節(jié)流加密為密文字節(jié)流

Byte[] Cryptograph = myRSACryptoServiceProvider.Encrypt(plainTextByte,gexinghua.org false);

利用1024為的密鑰加密,原料該當(dāng)是128字節(jié)(1024位)的byte[]的原始數(shù)據(jù),加密后的數(shù)據(jù)也是128字節(jié)(1024位),萬(wàn)一明文不足128字節(jié),RSACryptoServiceProvider會(huì)積極用隨機(jī)數(shù)補(bǔ)足128字節(jié)。

Dotnet的RSA告終有個(gè)個(gè)性,它定然要在明文中增加一些隨機(jī)數(shù),因而明文不能把128字節(jié)占滿,切實(shí)測(cè)驗(yàn),明文最多為117字節(jié),留下的空間用來(lái)添補(bǔ)隨機(jī)數(shù)。因而,用統(tǒng)一個(gè)密鑰對(duì)統(tǒng)一串字符串舉行加密,每次獲得的密文都是不一樣的。

4、 解密壟斷

//從證書文件載入證書,萬(wàn)一含有私鑰的,必需供給保留證書時(shí)設(shè)置的密碼

X509Certificate2 myX509Certificate2 = new X509Certificate2(@"C:/Samples/PartnerAEncryptMsg/MyTestCert.pfx", "password");

//從證書中獲得含私鑰的RSACryptoServiceProvider

RSACryptoServiceProvider myRSACryptoServiceProvider = (RSACryptoServiceProvider)myX509Certificate2.PrivateKey;

//利用RSACryptoServiceProvider把密文字節(jié)流解密為明文字節(jié)流

byte[] plaintextByte = myRSACryptoServiceProvider.Decrypt(Cryptograph, false);

解密必需載入含私鑰的pfx證書,必需供給私鑰防御密碼。

5、 從編碼字節(jié)流通成字符串明文

利用加密時(shí)批準(zhǔn)的同樣的代碼頁(yè)utf8把解密后的明文byte[]轉(zhuǎn)成字符串:string Plaintext = Encoding.UTF8.GetString(plaintextByte);

小知識(shí)之公鑰:

公鑰通常用于加密會(huì)話密鑰、驗(yàn)證數(shù)字簽名,或加密可以用相應(yīng)的私鑰解密的數(shù)據(jù)。