6

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

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

充气城堡

密码学应用程序块

Win32 PFXImportCertStore

导入 PEM

Microsoft 的 CLR 安全增强功能

微软压缩天然气

这是 Microsoft CNG 提供程序在 codeplex 上的 .NET dll 的代码(上图)...但是我不知道如何以DKIM 兼容的 ASN1 格式导出和导入公钥和私钥。

     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 格式导出/导入这些值?

4

1 回答 1

2

所以你只需要一个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 编码字符串中。

于 2017-06-01T11:02:38.813 回答