zoukankan      html  css  js  c++  java
  • [转贴]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

    我们创建一个标题为"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 关键词进行判断,作者偷懒,代码中就没有写了。
    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Java单例模式:为什么我强烈推荐你用枚举来实现单例模式
    为什么阿里Java规约要求谨慎修改serialVersionUID字段
    使用MyCat实现MySQL读写分离
    你知道HTTP协议的ETag是干什么的吗?
    在centos7中安装MySQL5.7
    MySQL实现主从复制功能
    Leetcode题目169.求众数(简单)
    Leetcode题目160.相交链表(简单)
    Leetcode题目155.最小栈(简单)
    Leetcode题目152.乘积最大子序列(动态规划-中等)
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1271171.html
Copyright © 2011-2022 走看看