[转贴]X.509 & RSA

简介: 原文:http://www.rainsts.net/article.asp?id=179    一些涉及到安全的领域,大多使用X.509证书,以此来保证数据交互的安全。 下面的代码演示如何使用X.509证书进行加密和解密操作。

原文:http://www.rainsts.net/article.asp?id=179 

 

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

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

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

我们创建一个标题为"Rainsoft",包含私钥的数字证书,并将其存储到个人区域。我们打开控制面板"Internet选项(或IE选项设置)"窗体,在"内容"标签单击"证书"按钮来打开数字证书管理界面。

uploads/200603/02_171420_cert1.gif

uploads/200603/02_171428_cert2.gif

uploads/200603/02_171432_cert3.gif


为了测试解密,我们的证书包含了私钥。我们可以使用导出功能导出公钥分发给目标用户。
uploads/200603/02_171437_cert4.gif


密钥存储区位置(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 关键词进行判断,作者偷懒,代码中就没有写了。
目录
相关文章
|
3月前
|
安全 算法 网络安全
RSA2048与RSA3072的闲言碎语
RSA2048与RSA3072的闲言碎语
74 0
如何生成RSA,RSA2密钥
密钥生成或如何使用(创建应用):[url]https://openclub.alipay.com/read.php?tid=1606&fid=72[/url] 1.密钥生成工具下载:[url]https://docs.
1454 1
|
算法
RSA和RSA2签名算法区别
RSA和RSA2签名算法 什么是数字签名? 一个很好的说明文档可以参考:What is a Digital Signature?,中文翻译可以参考:数字签名是什么?. 简单来说,签名主要包含两个过程:摘要和非对称加密,首先对需要签名的数据做摘要(类似于常见的MD5)后得到摘要结果,然后通过签名者的私钥对摘要结果进行非对称加密即可得到签名结果。
5036 0
如何生成pem密钥
本帖是介绍使用支付宝提供的一键生成密钥工具和OpenSSL工具生成pem格式密钥,仅供参考!! 可参看开放平台文档链接实现:[url]https://docs.open.alipay.com/291/106097[/url] 1.直接使用支付宝提供的一键生成工具生成; 2.使用OpenSSL工具生成。
4650 0
|
算法 Linux 数据安全/隐私保护
RSA加密算法
RSA加密算法
161 0
RSA加密算法
|
网络安全
RSA私钥和公钥文件格式 (pkcs#7, pkcs#8, pkcs#12, pem)
Format Name Description PKCS #7 Cryptographic Message Syntax Standard A PKCS #7 file can be used to store certificates, which is a SignedData structure without data (just the certificates).
3482 0
RSA,RSA2密钥和MD5说明
说明:   现在关于RSA,RSA2,DSA,MD5,AES加密原理这里就不说了,网上已经有很完善的资料可以供我们了解。   下面说说在集成支付宝接口常用的RSA2(强烈推荐使用!!!),RSA,MD5(不推荐使用) 签名方式使用优先级   RSA2>RSA>MD5 支付宝接口签名支持表     注:老板wap支付密钥相关产品已经下架大家无需关注 常见问题:   1.
1863 0
如何生成RSA2密钥
密钥文件说明:    1、rsa_private_key.pem:原始私钥(又称pkcs1私钥),适用于非Java开发语言;  2、rsa_private_key_pkcs8.pem:pkcs8私钥,适用于Java开发语言;  3、rsa_public_key.pem:商户公钥,需上传至应用中加签方式的应用公钥位置。
1938 0
|
算法 数据安全/隐私保护 Python
RSA
参考文献:https://www.anquanke.com/post/id/84632 RSA的加密过程 选择两个大素数p和q,计算出模数N = p * q 计算φ = (p−1) * (q−1) 即N的欧拉函数,然后选择一个e(1
1500 0