使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据

原创 2007年09月28日 15:39:00
前一部分:  使用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);

 

使用X.509数字证书加密解密实务(二)-- 使用RSA证书

转载自:http://blog.sina.com.cn/s/blog_6168ee920100jsqv.html X.509证书标准支持三种不对称加密算法:RSA, DSA, Diffie-Hell...
  • wyqlxy
  • wyqlxy
  • 2015年08月18日 17:53
  • 2247

使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据

一、  使用RSA证书加、解密敏感数据X.509证书标准支持三种不对称加密算法:RSA, DSA, Diffie-Hellman algorithms。最常用的是RSA算法。所以本文就以前面章节使用m...
  • aking8736
  • aking8736
  • 2011年05月05日 15:17
  • 795

使用RSA证书加密敏感数据

一、  使用RSA证书加、解密敏感数据 X.509证书标准支持三种不对称加密算法:RSA, DSA, Diffie-Hellman algorithms。最常用的是RSA算法。所以本文就以前面章节使...
  • yunhaiC
  • yunhaiC
  • 2016年09月24日 11:02
  • 1466

C#使用RSA证书文件加密和解密示例

http://www.cnblogs.com/eshizhan/archive/2012/10/07/2713680.html 修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中...
  • wyqlxy
  • wyqlxy
  • 2015年08月17日 11:15
  • 2085

java加密解密与数字证书的操作

1 keytool命令总结 一、创建数字证书 交互模式 使用默认的密钥库.keystore(目录是c: Documents and Setting用户名)和算法(DSA) ke...
  • lihuayong
  • lihuayong
  • 2013年12月14日 16:50
  • 10385

JAVA加密解密之数字证书

系统之间在进行交互的时候,我们经常会用到数字证书,数字证书可以帮我们验证身份等。...
  • jianggujin
  • jianggujin
  • 2016年12月06日 14:37
  • 1926

【信息安全】RSA-数字签名-数字证书

先说明几点: RSA加密算法过程是公钥加密、私钥解密 数字签名、数字证书都是私钥签名(可以理解为加密),公钥签名验证(可以理解为解密)。 1-4 是正常的rsa加密解密 5-9 是数字签名 5-...
  • Jammg
  • Jammg
  • 2016年07月11日 22:19
  • 1352

关于X.509V3公钥证书的扩展项

一般人对证书的其它各项比较熟悉,但对它的扩展项却比较陌生一些。那么这些扩展项都有什么作用呢?事实上,这些扩展项共有如下几类:   ◆Authority密钥标识符—证书所含密钥的唯一标识符,用来区分同一...
  • highlongsong
  • highlongsong
  • 2005年06月24日 09:15
  • 2059

X.509数字证书的结构与解析

1、什么叫数字签名数字签名:将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性...
  • xy010902100449
  • xy010902100449
  • 2016年08月07日 21:22
  • 3485

C#使用RSA证书文件加密和解密示例(任意长度的内容)

参考其他文章自己写的例子: using System; using System.IO; using System.Security.Cryptography; using System.Securi...
  • wyqlxy
  • wyqlxy
  • 2015年08月18日 10:34
  • 3438
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据
举报原因:
原因补充:

(最多只允许输入30个字)