【问题标题】:ImportPkcs8PrivateKey and ImportRSAPrivateKey alternative in .net framework.net 框架中的 ImportPkcs8PrivateKey 和 ImportRSAPrivateKey 替代方案
【发布时间】:2020-06-25 08:46:54
【问题描述】:

在 .net core 3.1 中,我使用 ImportPkcs8PrivateKey 和 ImportRSAPrivateKey 进行一些 RSA 私钥导入,按照以下功能

 private RSA RsaKeyAsPerContent()
        {
            //https://csfieldguide.org.nz/en/interactives/rsa-key-generator/
            //https://travistidwell.com/jsencrypt/demo/
            RSA rSA = RSA.Create();
            string privateKeyContent = "...."
            bool isPkcsprivateKey = privateKeyContent.Contains("BEGIN PRIVATE KEY");
            if (isPkcsprivateKey)
            {
                var privateKey = privateKeyContent.Replace("-----BEGIN PRIVATE KEY-----", string.Empty).Replace("-----END PRIVATE KEY-----", string.Empty);
                privateKey = privateKey.Replace(Environment.NewLine, string.Empty);
                var privateKeyBytes = Convert.FromBase64String(privateKey);
                rSA.ImportPkcs8PrivateKey(privateKeyBytes, out int _);
            }
            else
            {
                var privateKey = privateKeyContent.Replace("-----BEGIN RSA PRIVATE KEY-----", string.Empty).Replace("-----END RSA PRIVATE KEY-----", string.Empty);
                privateKey = privateKey.Replace(Environment.NewLine, string.Empty);
                var privateKeyBytes = Convert.FromBase64String(privateKey);
                rSA.ImportRSAPrivateKey(privateKeyBytes, out int _);
            }
            return rSA;
        }

现在我需要在传统的 .net 框架版本 4.6/4.7 中具有相同的导入功能,但它不可用 知道如何在 .net 框架中做到这一点

【问题讨论】:

  • @Topaco 请检查我的回答
  • 我不想使用第 3 方库。因此,我使用了我拥有的 PEM 文件和密钥,并使用 openssl 将这对转换为 pfx 文件,该文件可以轻松地与现有的 .NET 框架一起使用。

标签: c# .net rsa


【解决方案1】:

您可以尝试以下方法。它已经在 .net framework 4.8 上进行了测试,它使用了第 3 方包“BouncyCastle.Crypto”。

   public static RSACryptoServiceProvider ImportPrivateKey(string pem) {
        PemReader pr = new PemReader(new StringReader(pem));
        AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
        RSAParameters rsaParams = 
        DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)KeyPair.Private);

        RSACryptoServiceProvider csp = new RSACryptoServiceProvider();// cspParams);
        csp.ImportParameters(rsaParams);
        return csp;
    }

您可以参考https://gist.github.com/ststeiger/f4b29a140b1e3fd618679f89b7f3ff4a了解更多详情。

【讨论】:

  • 它基本上是其他类型 rsa 私钥内容的附加选项
【解决方案2】:

以下用于.net framework 4.6

 private static RSA RsaKeyAsPerContent()
        {
            RSA rSA = RSA.Create();

            string privateKeyFromConfig = ConfigurationManager.AppSettings["privateKey"];
            rSA.ImportParameters(ImportPrivateKey(privateKeyFromConfig));
            return rSA;
        }

        public static RSAParameters ImportPrivateKey(string pem)
        {
            PemReader pr = new PemReader(new StringReader(pem));
            RsaPrivateCrtKeyParameters privKey = (RsaPrivateCrtKeyParameters)pr.ReadObject();
            RSAParameters rp = new RSAParameters();
            rp.Modulus = privKey.Modulus.ToByteArrayUnsigned();
            rp.Exponent = privKey.PublicExponent.ToByteArrayUnsigned();
            rp.P = privKey.P.ToByteArrayUnsigned();
            rp.Q = privKey.Q.ToByteArrayUnsigned();
            rp.D = ConvertRSAParametersField(privKey.Exponent, rp.Modulus.Length);
            rp.DP = ConvertRSAParametersField(privKey.DP, rp.P.Length);
            rp.DQ = ConvertRSAParametersField(privKey.DQ, rp.Q.Length);
            rp.InverseQ = ConvertRSAParametersField(privKey.QInv, rp.Q.Length);

           
            return rp;
        }

        private static byte[] ConvertRSAParametersField(BigInteger n, int size)
        {
            byte[] bs = n.ToByteArrayUnsigned();
            if (bs.Length == size)
                return bs;
            if (bs.Length > size)
                throw new ArgumentException("Specified size too small", "size");
            byte[] padded = new byte[size];
            Array.Copy(bs, 0, padded, size - bs.Length, bs.Length);
            return padded;
        }

【讨论】:

  • 您忽略了这需要 Bouncycastle C# 库。
  • 我个人不想要。如果有什么没有充气城堡的,请告诉我
  • @PresidentJamesK.Polk 如果上述充气城堡相关的实现有任何问题,请告诉我。我需要实施来帮助某人。否则我在我自己的应用程序中使用 .net core 3.1 特定的 api 没有任何问题
  • PemReader 是一个 bouncycastle 类,RsaPrivateCrtKeyParameters 也是。
  • 我知道。我是说我目前还没有找到任何替代方案,如果有人有任何示例,欢迎使用仅框架类
猜你喜欢
  • 1970-01-01
  • 2010-11-09
  • 2022-01-13
  • 2014-08-14
  • 1970-01-01
  • 2010-09-07
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多