X.509 & RSA
原文:http://www.rainsts.net/article.asp?id=179
一些涉及到安全的领域,大多使用X.509证书,以此来保证数据交互的安全。
下面的代码演示如何使用X.509证书进行加密和解密操作。
首先使用 markcert.exe 创建测试用证书。
c:\>makecert -r -pe -n "CN=Rainsoft" -ss My
makecert -sr localmachine -ss My -n CN=WCFServerPK -sky exchange -pe -r
makecert 证书工具名
-r 表示即将生成的证书是自我签署的,自己给自己发奖(这里主要是指颁发机构)
-pe 表示将所生成的私钥标记为可导出。这样可将私钥包括在证书中
-$ 证书是个人用还是商用(individual/commercial)老美就是搞啊,这玩意用美元符号还真是形象得很。
-n 表示证书主题,你就当它是标题吧,不管你取什么名字,必须包含CN=前缀
-sky 指定主题的密钥类型,必须是 signature、exchange 或一个表示提供程序类型的整数。默认情况下,可传入 1 表示交换密钥,传入 2 表示签名密钥
-sr 指定主题的证书存储位置。Location 可以是 currentuser(默认值)或 localmachine(实际是必须是这两个中的一个值)
-ss 指定主题的证书存储名称,输出证书即存储在那里
我们创建一个标题为"Rainsoft",包含私钥的数字证书,并将其存储到个人区域。我们打开控制面板"Internet选项(或IE选项设置)"窗体,在"内容"标签单击"证书"按钮来打开数字证书管理界面。
为了测试解密,我们的证书包含了私钥。我们可以使用导出功能导出公钥分发给目标用户。
密钥存储区位置(StoreName)包括:
--------------------------------------------------------------------------------------------------
AddressBook 其他用户的 X.509 证书存储区。
AuthRoot 第三方证书颁发机构 (CA) 的 X.509 证书存储区。
CertificateAuthority 中间证书颁发机构 (CA) 的 X.509 证书存储区。
Disallowed 吊销的证书的 X.509 证书存储区。
My 个人证书的 X.509 证书存储区。
Root 受信任的根证书颁发机构 (CA) 的 X.509 证书存储区。
TrustedPeople 直接受信任的人和资源的 X.509 证书存储区。
TrustedPublisher 直接受信任的发行者的 X.509 证书存储区。
演示代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.IO;
namespace Test.CUI
{
class Program
{
static void Main(string[] args)
{
// 打开证书存储区
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadWrite);
// 检索证书
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Rainsoft", false); // vaildOnly = true时搜索无结果。
if (certs.Count == 0) return;
X509Certificate2 cert = certs[0];
// store.Remove(cert); // 从存储区删除证书。
store.Close(); // 关闭存储区。
// 使用公钥加密
RSACryptoServiceProvider rsa = cert.PublicKey.Key as RSACryptoServiceProvider;
byte[] enc = rsa.Encrypt(Encoding.Unicode.GetBytes("Hello, World!"), false);
// 使用私钥解密
if (cert.HasPrivateKey)
{
RSACryptoServiceProvider rsaA = cert.PrivateKey as RSACryptoServiceProvider;
rsaA.FromXmlString(rsaA.ToXmlString(true)); // 奇怪! 不重新设置密钥就会抛出异常。
byte[] dec = rsaA.Decrypt(enc, false);
Console.WriteLine(Encoding.Unicode.GetString(dec));
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey(true);
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.IO;
namespace Test.CUI
{
class Program
{
static void Main(string[] args)
{
// 打开证书存储区
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadWrite);
// 检索证书
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Rainsoft", false); // vaildOnly = true时搜索无结果。
if (certs.Count == 0) return;
X509Certificate2 cert = certs[0];
// store.Remove(cert); // 从存储区删除证书。
store.Close(); // 关闭存储区。
// 使用公钥加密
RSACryptoServiceProvider rsa = cert.PublicKey.Key as RSACryptoServiceProvider;
byte[] enc = rsa.Encrypt(Encoding.Unicode.GetBytes("Hello, World!"), false);
// 使用私钥解密
if (cert.HasPrivateKey)
{
RSACryptoServiceProvider rsaA = cert.PrivateKey as RSACryptoServiceProvider;
rsaA.FromXmlString(rsaA.ToXmlString(true)); // 奇怪! 不重新设置密钥就会抛出异常。
byte[] dec = rsaA.Decrypt(enc, false);
Console.WriteLine(Encoding.Unicode.GetString(dec));
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey(true);
}
}
}
另外加密算法也可能是DSA,可以使用 is 关键词进行判断,作者偷懒,代码中就没有写了。





浙公网安备 33010602011771号