.net 证书的使用

下载OpenSSL

下载地址:https://sourceforge.net/projects/openssl/files/latest/download

创建SSL证书

-- 创建密钥(jieke.key)和公钥证书(jieke.crt)
openssl req -newkey rsa:2048 -nodes -keyout jieke.key -x509 -days 365 -out jieke.crt -subj "/C=CN/ST=JiangXi/L=NanChang/O=kf/OU=sf/CN=*.baidu.com/emailAddress=jieke@abc.com"

-- 使用密钥和公钥证书创建带有公钥和私钥的证书(jieke.pfx)
openssl pkcs12 -export -out jieke.pfx -inkey jieke.key -in jieke.crt
-- 该命令会要求输入密码

部分命令参数解释如下:

  • days 证书有效天数
  • subj 证书签名内容

创建.net控制台程序

将上一步骤生成的公钥证书即带有公钥和私钥的证书拷贝到项目的Certificates目录下,并设置始终复制

加密解密及签名验签的测试代码如下:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;

class Program
{
        static void Main(string[] args)
        {
            TestForEncryptAndEncrypt();
            TestForSignDataAndVerificationSignature();
        }

        // 公钥加密、私钥解密
        static void TestForEncryptAndEncrypt()
        {
            string plainText = Guid.NewGuid().ToString();
            string encryptedText = string.Empty;
            {
                string certificatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Certificates", "jieke.crt");
                string certificatePwd = "";
                X509Certificate2 x509Certificate2 = new X509Certificate2(certificatePath, certificatePwd, X509KeyStorageFlags.MachineKeySet);
                encryptedText = Encrypt(plainText, x509Certificate2);
            }

            string decryptedText = string.Empty;
            {
                string certificatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Certificates", "jieke.pfx");
                string certificatePwd = "123456";
                X509Certificate2 x509Certificate2 = new X509Certificate2(certificatePath, certificatePwd, X509KeyStorageFlags.MachineKeySet);
                decryptedText = Decrypt(encryptedText, x509Certificate2);
            }
        }

        // 加密
        static string Encrypt(string plainText, X509Certificate2 cert)
        {
            RSACryptoServiceProvider publicKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
            byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
            byte[] encryptedBytes = publicKey.Encrypt(plainBytes, false);
            string encryptedText = Convert.ToBase64String(encryptedBytes);
            return encryptedText;
        }

         // 解密
        static string Decrypt(string encryptedText, X509Certificate2 cert)
        {
            RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)cert.PrivateKey;
            byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
            byte[] decryptedBytes = privateKey.Decrypt(encryptedBytes, false);
            string decryptedText = Encoding.UTF8.GetString(decryptedBytes);
            return decryptedText;
        }

        // 私钥签名、公钥验签
        static void TestForSignDataAndVerificationSignature()
        {
            string plainText = Guid.NewGuid().ToString();
            string signatureString = string.Empty;
            {
                string certificatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Certificates", "jieke.pfx");
                string certificatePwd = "123456";
                X509Certificate2 x509Certificate2 = new X509Certificate2(certificatePath, certificatePwd, X509KeyStorageFlags.MachineKeySet);

                signatureString = SignData(x509Certificate2, plainText);
            }

            {
                string certificatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Certificates", "jieke.crt");
                string certificatePwd = "123456";
                X509Certificate2 x509Certificate2 = new X509Certificate2(certificatePath, certificatePwd, X509KeyStorageFlags.MachineKeySet);

                bool vefified = VerificationSignature(x509Certificate2, plainText, signatureString);
                Console.WriteLine(vefified);
            }
        }

        // 验证签名
        static bool VerificationSignature(X509Certificate2 cert, string data, string signatureString)
        {
            byte[] dataBuffer = Encoding.UTF8.GetBytes(data);
            byte[] signatureBuffer = Convert.FromBase64String(signatureString);
            return (cert.PublicKey.Key as RSACryptoServiceProvider).VerifyData(dataBuffer, new SHA1CryptoServiceProvider(), signatureBuffer);
        }

        // 生成签名
        static string SignData(X509Certificate2 cert, string data)
        {
            if (cert.HasPrivateKey == false) return null;
            byte[] dataBuffer = Encoding.UTF8.GetBytes(data);
            byte[] signatureBuffer = (cert.PrivateKey as RSACryptoServiceProvider).SignData(dataBuffer, new SHA1CryptoServiceProvider());
            return Convert.ToBase64String(signatureBuffer);
        }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • OpenSSL 概述 OpenSSL 的结构 OpenSSL 目录功能对照表 目录名功能描述Crypto存放 Op...
    独木舟的木阅读 21,865评论 1 10
  • 前言 文中首先解释加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的...
    sunny冲哥阅读 8,161评论 0 2
  • 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现...
    sunny冲哥阅读 5,202评论 0 3
  • 本文转载,出处如下:数字证书原理 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了...
    随安居士阅读 5,640评论 1 8
  • 数字证书原理 - 无恙 - 博客园 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明...
    拉肚阅读 5,600评论 0 3