使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据(转)
一、?使用RSA證書(shū)加、解密敏感數(shù)據(jù)
X.509證書(shū)標(biāo)準(zhǔn)支持三種不對(duì)稱(chēng)加密算法:RSA, DSA, Diffie-Hellman algorithms。最常用的是RSA算法。所以本文就以前面章節(jié)使用makecert工具生成的生成的MyTestCert證書(shū)進(jìn)行加密解密,這個(gè)證書(shū)具有RSA算法1024位的密鑰對(duì)。
?
Figure 12. RSA加密解密過(guò)程
1、 生成證書(shū)、分發(fā)證書(shū)
證書(shū)使用前面“使用makecert工具獲得”章節(jié)生成的MyTestCert,當(dāng)然也可以是從商業(yè)CA獲得的證書(shū)。
你獲得的證書(shū)應(yīng)該是含有公鑰和私鑰的完整證書(shū),一般是pfx形式的證書(shū)。
要接收加密數(shù)據(jù),需要把你的公鑰分發(fā)給加密數(shù)據(jù)的加密方,加密方使用你的公鑰加密數(shù)據(jù)。
證書(shū)要么以pfx形式存在,要么被導(dǎo)入到證書(shū)存儲(chǔ)區(qū)。
如果你的證書(shū)存在于證書(shū)存儲(chǔ)區(qū)可以通過(guò)證書(shū)管理控制臺(tái)提供的證書(shū)導(dǎo)出功能導(dǎo)出只含有公鑰的cer證書(shū)。
如果證書(shū)以pfx證書(shū)文件形式存在,可以通過(guò)代碼讀取證書(shū)然后導(dǎo)出為只含公鑰的cer證書(shū)。
參考前面章節(jié)導(dǎo)出一個(gè)名為MyTestCert.cer證書(shū),將此證書(shū)分發(fā)給需要用來(lái)加密的加密方。
2、 字符串明文轉(zhuǎn)成某一代碼頁(yè)對(duì)應(yīng)的編碼字節(jié)流
待加密的數(shù)據(jù)可能有兩種形式,一種是二進(jìn)制的數(shù)據(jù),本身就是一組字節(jié)流,這樣的數(shù)據(jù)可以跳過(guò)這一步,直接進(jìn)入加密步驟。還有一種情況是字符串?dāng)?shù)據(jù),字符串中同樣的字符使用不同的代碼頁(yè)會(huì)生成不同的字節(jié)碼,所以從字符串到字節(jié)流的轉(zhuǎn)換是需要指定使用何種編碼的。在解密之后,要從字節(jié)流轉(zhuǎn)換到字符串就要使用相同的代碼頁(yè)解碼,否則就會(huì)出現(xiàn)亂碼。
//保存明文文件的字節(jié)數(shù)組
Byte[] plainTextByte = Encoding.UTF8.GetBytes(“RSA證書(shū)對(duì)敏感數(shù)據(jù)進(jìn)行加密!”);
這里用utf8代碼頁(yè)對(duì)明文進(jìn)行編碼,把明文字符串轉(zhuǎn)成字節(jié)流。
3、 加密操作
//從只包含公鑰的證書(shū)文件載入證書(shū)
X509Certificate2 myX509Certificate2 = new X509Certificate2(@"C:\Samples\PartnerAEncryptMsg\MyTestCert.cer");
//從cer證書(shū)中獲得含公鑰的RSACryptoServiceProvider
RSACryptoServiceProvider myRSACryptoServiceProvider = (RSACryptoServiceProvider)myX509Certificate2.PublicKey.Key;
//使用RSACryptoServiceProvider把明文字節(jié)流加密為密文字節(jié)流
Byte[] Cryptograph = myRSACryptoServiceProvider.Encrypt(plainTextByte, false);
使用1024為的密鑰加密,原料應(yīng)該是128字節(jié)(1024位)的byte[]的原始數(shù)據(jù),加密后的數(shù)據(jù)也是128字節(jié)(1024位),如果明文不足128字節(jié),RSACryptoServiceProvider會(huì)自動(dòng)用隨機(jī)數(shù)補(bǔ)足128字節(jié)。
Dotnet的RSA實(shí)現(xiàn)有個(gè)特點(diǎn),它必須要在明文中添加一些隨機(jī)數(shù),所以明文不能把128字節(jié)占滿(mǎn),實(shí)際測(cè)試,明文最多為117字節(jié),留下的空間用來(lái)填充隨機(jī)數(shù)。
所以,用同一個(gè)密鑰對(duì)同一串字符串進(jìn)行加密,每次得到的密文都是不一樣的。
4、 解密操作
//從證書(shū)文件載入證書(shū),如果含有私鑰的,需要提供保存證書(shū)時(shí)設(shè)置的密碼
X509Certificate2 myX509Certificate2 = new X509Certificate2(@"C:\Samples\PartnerAEncryptMsg\MyTestCert.pfx", "password");
//從證書(shū)中獲得含私鑰的RSACryptoServiceProvider
RSACryptoServiceProvider myRSACryptoServiceProvider = (RSACryptoServiceProvider)myX509Certificate2.PrivateKey;
//使用RSACryptoServiceProvider把密文字節(jié)流解密為明文字節(jié)流
byte[] plaintextByte = myRSACryptoServiceProvider.Decrypt(Cryptograph, false);
解密需要載入含私鑰的pfx證書(shū),需要提供私鑰保護(hù)密碼。
5、 從編碼字節(jié)流轉(zhuǎn)成字符串明文
使用加密時(shí)采用的同樣的代碼頁(yè)utf8把解密后的明文byte[]轉(zhuǎn)成字符串
string Plaintext = Encoding.UTF8.GetString(plaintextByte);
轉(zhuǎn)載于:https://www.cnblogs.com/millen/archive/2011/05/03/2035071.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# WCF WinCE 解决方案
- 下一篇: mcf5271如何使用数学库函数