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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    免费的视频、音频转文本
    Errors are values
    Codebase Refactoring (with help from Go)
    Golang中的坑二
    Cleaner, more elegant, and wrong(msdn blog)
    Cleaner, more elegant, and wrong(翻译)
    Cleaner, more elegant, and harder to recognize(翻译)
    vue控制父子组件渲染顺序
    computed 和 watch 组合使用,监听数据全局数据状态
    webstorm破解方法
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1271171.html
Copyright © 2011-2022 走看看