X.509 & RSA

一些涉及到安全的领域,大多使用X.509证书,以此来保证数据交互的安全。
下面的代码演示如何使用X.509证书进行加密和解密操作。

首先使用 markcert.exe 创建测试用证书。

c:/>makecert -r -pe -n "CN=Rainsoft" -ss My

我们创建一个标题为"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); } } }


另外加密算法也可能是DSA,可以使用 is 关键词进行判断,作者偷懒,代码中就没有写了。

你可能感兴趣的:(加密,解密,测试,存储,byte,internet)