Focus on biztalk -- chnking

心无旁骛,专注于biztalk......

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  75 随笔 :: 0 文章 :: 517 评论 :: 75 引用
前一部分:  使用X.509数字证书加密解密实务(一)-- 证书的获得和管理

一、  使用RSA证书加、解密敏感数据

X.509证书标准支持三种不对称加密算法:RSA, DSA, Diffie-Hellman algorithms。最常用的是RSA算法。所以本文就以前面章节使用makecert工具生成的生成的MyTestCert证书进行加密解密,这个证书具有RSA算法1024位的密钥对。

 


Figure 12. RSA加密解密过程

1、 生成证书、分发证书

证书使用前面“使用makecert工具获得”章节生成的MyTestCert,当然也可以是从商业CA获得的证书。

你获得的证书应该是含有公钥和私钥的完整证书,一般是pfx形式的证书。

要接收加密数据,需要把你的公钥分发给加密数据的加密方,加密方使用你的公钥加密数据。

证书要么以pfx形式存在,要么被导入到证书存储区。

如果你的证书存在于证书存储区可以通过证书管理控制台提供的证书导出功能导出只含有公钥的cer证书。

如果证书以pfx证书文件形式存在,可以通过代码读取证书然后导出为只含公钥的cer证书。

参考前面章节导出一个名为MyTestCert.cer证书,将此证书分发给需要用来加密的加密方。

2、 字符串明文转成某一代码页对应的编码字节流

待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。

//保存明文文件的字节数组

Byte[] plainTextByte = Encoding.UTF8.GetBytes(“RSA证书对敏感数据进行加密!”);

这里用utf8代码页对明文进行编码,把明文字符串转成字节流。

3、 加密操作

//从只包含公钥的证书文件载入证书

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

//cer证书中获得含公钥的RSACryptoServiceProvider

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

//使用RSACryptoServiceProvider把明文字节流加密为密文字节流

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

使用1024为的密钥加密,原料应该是128字节(1024位)的byte[]的原始数据,加密后的数据也是128字节(1024位),如果明文不足128字节,RSACryptoServiceProvider会自动用随机数补足128字节。

DotnetRSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实际测试,明文最多为117字节,留下的空间用来填充随机数。

所以,用同一个密钥对同一串字符串进行加密,每次得到的密文都是不一样的。

4、 解密操作

//从证书文件载入证书,如果含有私钥的,需要提供保存证书时设置的密码

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

//从证书中获得含私钥的RSACryptoServiceProvider

RSACryptoServiceProvider myRSACryptoServiceProvider = (RSACryptoServiceProvider)myX509Certificate2.PrivateKey;

//使用RSACryptoServiceProvider把密文字节流解密为明文字节流

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

解密需要载入含私钥的pfx证书,需要提供私钥保护密码。

5、 从编码字节流转成字符串明文

使用加密时采用的同样的代码页utf8把解密后的明文byte[]转成字符串

string Plaintext = Encoding.UTF8.GetString(plaintextByte);

posted on 2007-08-30 16:03 chnking 阅读(3817) 评论(13)  编辑 收藏 网摘 所属分类: asp.netbiztalkVS2005&C#

评论

#1楼 2007-08-30 17:43 西煞魄工人      
Kent, 你的图现在画的越来越精彩了!
  回复  引用  查看    

#2楼 2007-08-31 09:15 Allen Zhang      
使用1024为的密钥加密,原料应该是128字节(1024位)的byte[]的原始数据,加密后的数据也是128字节(1024位),如果明文不足128字节,RSACryptoServiceProvider会自动用随机数补足128字节。
能不能解释一下,还有,如果明文(是不是待加密的数据)不止128字节呢?

  回复  引用  查看    

#3楼[楼主] 2007-08-31 10:16 chnking      
使用随机数是为了每次生成的密文都不一样,增加安全性。
RSA算法复杂,加密解密时间比较长,不适合做大数据量的加密解密。对称算法相对简单,加密解密速度快,但是对称加密解密使用同一个密钥,加密解密双方要都有这个密钥,密钥的传送过程是个危险。
实际使用中对大数据的加密解密一般是不对称算法和对称算法配合使用。用非对称算法的公钥加密对称算法的密钥,然后用对称密钥加密实际数据,最后一起传送。
接收方收到后,用非对称加密的私钥解密加密后的对称密钥,在用对称密钥解密加密的实际数据。
具体实现,见本文的第三部分。

  回复  引用  查看    

#4楼 2007-09-01 11:31 Allen Zhang      
@chnking
实际使用中对大数据的加密解密一般是不对称算法和对称算法配合使用。用非对称算法的公钥加密对称算法的密钥,然后用对称密钥加密实际数据,最后一起传送。
你指的这种方法,跟从原文Hash算法计算得出一串摘要串,再用私钥加密这个摘要串,这个是差不多的原理吧。

  回复  引用  查看    

#5楼[楼主] 2007-09-01 11:58 chnking      
@Allen Zhang

你这说的是签名的用法,都是不对称密钥的用法,基本原理都一样:使用不对称算法的一个密钥加密的数据,只能由密钥对的另一个密钥解密。

  回复  引用  查看    

#6楼 2007-09-26 17:51 zongfei[未注册用户]
Thanks a lot , it is very useful!
  回复  引用    

#7楼 2007-10-17 16:47 alexyang[未注册用户]
private void _EncryptBtn_Click(object sender, EventArgs e)
{
string strTest = "Test";
UTF8Encoding enc=new UTF8Encoding();
byte[] byteToEncrypt = enc.GetBytes(strTest);
X509Certificate2 oX509Certificate2 = new X509Certificate2(@"E:\VSSWorkFolder\RolTest\RolTest\bin\Debug\a.cer");
RSACryptoServiceProvider oRSACryptoServiceProvider = (RSACryptoServiceProvider)oX509Certificate2.PublicKey.Key;
byte[] encryptedBytes = oRSACryptoServiceProvider.Encrypt(byteToEncrypt, false);
X509Certificate2 ooX509Certificate2 = new X509Certificate2(@"E:\VSSWorkFolder\RolTest\RolTest\bin\Debug\a.pfx", "123456");
RSACryptoServiceProvider ooRSACryptoSierviceProvider = (RSACryptoServiceProvider)ooX509Certificate2.PrivateKey;
byte[] decrptedBytes = oRSACryptoServiceProvider.Decrypt(encryptedBytes, false);
MessageBox.Show(enc.GetString(decrptedBytes));
}
请问那个地方出了问题,跪求LZ帮忙
System.Security.Cryptography.CryptographicException was unhandled
Message="Bad Key.\r\n"
Source="mscorlib"

  回复  引用    

#8楼[楼主] 2007-10-17 17:28 chnking      
Bad Key

哪一句出的错,检查那一句对应的密钥有没有问题

  回复  引用  查看    

#9楼 2008-03-12 17:44 Blackie1[未注册用户]
客户端第一次访问服务器端,下载了一份证书。
客户端利用这个证书加密一条命令发到服务器端,服务器端是可以解密。
服务器端根据命令也加密一段数据返回给客户端,

这时候客户端有可能是用什么解密????

我跟踪数据,发送相同的命令,每次的加密后往返的报文都不一样。。


这是我跟踪别人的软件发送的数据的结果,可以帮我做个猜想吗,不胜感谢!

我的QQ是:16212091

  回复  引用    

#10楼 2009-01-07 08:47 jhtchina      
牛人就是牛人

  回复  引用  查看    

#11楼 2009-01-28 12:38 kaixin [未注册用户]
哪位有时间帮帮我
我想实现给自己的文件数字证书加密
有谁可以分享一下VC++的代码或者程序样式的
谢谢!!!!
邮箱:358005474@163.com

  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 875947




相关文章:

相关链接: