zoukankan      html  css  js  c++  java
  • RSA 相关

    1. C# 生成Pem格式的公私钥,支持 PKCS 1 、PKCS2

    using Org.BouncyCastle.Asn1.Pkcs;
    using Org.BouncyCastle.Asn1.X509;
    using Org.BouncyCastle.Crypto.Parameters;
    using Org.BouncyCastle.Math;
    using Org.BouncyCastle.OpenSsl;
    using Org.BouncyCastle.Pkcs;
    using Org.BouncyCastle.X509;
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Security.Cryptography;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    
                string xmlPrivateKey = rsa.ToXmlString(true);//XML密钥
                string pemPrivateKey = Xml2PemPrivate(xmlPrivateKey, "d:/mykey/privatePEM.txt",8);//PEM密钥
    
                string xmlPublicKey = rsa.ToXmlString(false);//XML公钥
                string pemPublicKey = Xml2PemPublic(xmlPublicKey, "d:/mykey/publicPEM.txt");//PEM公钥
            }
    
            /// <summary>
            ///  XML格式公钥转PEM格式公钥
            /// </summary>
            /// <param name="xml">XML格式的公钥</param>
            /// <param name="saveFile">保存文件的物理路径</param>
            /// <param name="pkcsVersion">PKCS版本 1为非 java 用 8为java用</param>
            public static string Xml2PemPublic(string xml, string saveFile)
            {
                var rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xml);
                var p = rsa.ExportParameters(false);
                RsaKeyParameters key = new RsaKeyParameters(false, new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent));
    
               
    
    
    
                SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(key);
                byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
               
                string publicKey = Convert.ToBase64String(serializedPublicBytes);
    
    
                using (var sw = new StreamWriter(saveFile))
                {
                    sw.Write(publicKey);
                }
                return publicKey;
            }
    
            /// <summary>
            ///  XML格式私钥转PEM
            /// </summary>
            /// <param name="xml">XML格式私钥</param>
            /// <param name="saveFile">保存文件的物理路径</param>
            /// <param name="pkcsVersion">PKCS版本</param>
            public static string Xml2PemPrivate(string xml, string saveFile, int pkcsVersion=1)
            {
                var rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xml);
                var p = rsa.ExportParameters(true);
                var key = new RsaPrivateCrtKeyParameters(
                    new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent), new BigInteger(1, p.D),
                    new BigInteger(1, p.P), new BigInteger(1, p.Q), new BigInteger(1, p.DP), new BigInteger(1, p.DQ),
                    new BigInteger(1, p.InverseQ));
    
    
                var privateKey = "";
    
                if (pkcsVersion == 1)
                {
                    PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(key);
                    byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
                    privateKey = Convert.ToBase64String(serializedPrivateBytes);
    
                 
                }
                else if (pkcsVersion ==8)
                {
                    // pkcs8 转换
                    var pkcs8 = new Pkcs8Generator(key);
                     privateKey = Convert.ToBase64String(pkcs8.Generate().Content);
    
                }
                else
                {
                    throw new InvalidOperationException("不支持的pkcsVersion");
                }
    
    
                using (var sw = new StreamWriter(saveFile))
                {
                    sw.Write(privateKey);
                }
    
                return privateKey;
            }
    
            /// <summary>
            ///  格式化公钥/私钥
            /// </summary>
            /// <param name="key">生成的公钥/私钥</param>
            /// <param name="type">1:公钥 2:私钥</param>
            /// <returns>PEM格式的公钥/私钥</returns>
            //public static string Format(string key, int type)
            //{
            //    string result = string.Empty;
    
            //    int length = key.Length / 64;
            //    for (int i = 0; i < length; i++)
            //    {
            //        int start = i * 64;
            //        result = result + key.Substring(start, 64) + "
    ";
            //    }
    
            //    result = result + key.Substring(length * 64);
            //    if (type == 1)
            //    {
            //        result = result.Insert(0, "-----BEGIN PUBLIC KEY-----
    ");
            //        result += "
    -----END PUBLIC KEY-----";
            //    }
            //    if (type == 2)
            //    {
            //        result = result.Insert(0, "-----BEGIN PRIVATE KEY-----
    ");
            //        result += "
    -----END PRIVATE KEY-----";
            //    }
    
            //    return result;
            //}
        }
    }
  • 相关阅读:
    软件工程14—第09组 Beta冲刺(2/4)
    软件工程13—第09组 Beta冲刺(1/4)
    软件工程12—第09组 Alpha事后诸葛
    软件工程11—第09组 Alpha冲刺(4/4)
    软件工程10—第09组 Alpha冲刺(3/4)
    软件工程09—第09组 Alpha冲刺(2/4)
    软件工程08—第09组 Alpha冲刺(1/4)
    软件工程07—第09组 团队Git现场编程实战
    软件工程06—亚瑟王の十三水2.0
    第06组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/gaocong/p/13220585.html
Copyright © 2011-2022 走看看