【问题标题】:Using CngKey to Generate RSA key pair in PEM (DKIM compatible) using C#.... similar to "openssl rsa"使用 CngKey 在 PEM 中生成 RSA 密钥对(与 DKIM 兼容)使用 C#....类似于“openssl rsa”
【发布时间】:2012-06-29 17:59:15
【问题描述】:

是否可以仅使用 C# 生成 RSA 密钥对,将其导出为与DKIM's PEM-like format 兼容的 ASN1 格式?

我想减少对第 3 方的依赖,但这里有一些我发现

充气城堡

密码学应用程序块

Win32 PFXImportCertStore

导入 PEM

Microsoft 的 CLR 安全增强功能

微软 CNG

这是 Microsoft CNG 提供商的代码,在 codeplex 上带有 .NET dll(上图)...但是我不知道如何在 DKIM compatible ASN1 format 中导出和导入公钥和私钥。

     byte[] pkcs8PrivateKey = null;
        byte[] signedData = null;

        CngKey key = CngKey.Create(CngAlgorithm2.Rsa);
       byte[] exportedPrivateBytes = key.Export(CngKeyBlobFormat.GenericPrivateBlob);

       string exportedPrivateString= Encoding.UTF8.GetString(exportedPrivateBytes);

        pkcs8PrivateKey = Encoding.UTF8.GetBytes(exportedPrivateString);

        using (CngKey signingKey = CngKey.Import(pkcs8PrivateKey, CngKeyBlobFormat.Pkcs8PrivateBlob))
        {
            using (RSACng rsa = new RSACng(signingKey))
            {
                rsa.SignatureHashAlgorithm = CngAlgorithm.Sha1;
                signedData = rsa.SignData(dataToSign);
            }
        }

问题

是否有使用 Microsoft 库(Codeplex 上的 Win32、PFX 或 CLR)的直接示例来说明如何创建密钥对并以 PEM 格式导出/导入这些值?

【问题讨论】:

  • PEM 并不是一种真正的格式,因此您需要更具体地说明您想要“PEM 格式”的原因,以及您希望与之互操作的内容。
  • @GregS 我更新了这个问题。我想要与存储在 DNS 中的 DKIM 条目兼容的 ASN1 格式
  • 这看起来像是对您问题的回答:blogs.msdn.com/b/dcook/archive/2008/11/25/…

标签: c# certificate rsa pem


【解决方案1】:

所以你只需要一个 pkcs8 的密钥。

CngKeyCreationParameters ckcParams = new CngKeyCreationParameters()
{
    ExportPolicy = CngExportPolicies.AllowPlaintextExport,
    KeyCreationOptions = CngKeyCreationOptions.None,
    KeyUsage = CngKeyUsages.AllUsages,                
};
ckcParams.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(2048), CngPropertyOptions.None));

myCngKey = CngKey.Create(CngAlgorithm.Rsa, null, ckcParams);

byte[] privatePlainTextBlob = myCngKey.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);
Console.WriteLine(Convert.ToBase64String(privatePlainTextBlob));
}

现在您的密钥对包含在 PKCS#8 ASN.1 编码字符串中。

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2011-01-07
    • 2018-10-07
    • 1970-01-01
    相关资源
    最近更新 更多