使用CngKey在PEM(DKIM兼容)中使用C#生成RSA密钥对....类似于“openssl rsa”

时间:2012-06-29 17:59:15

标签: c# certificate rsa pem

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

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

Bouncy Castle

加密应用程序阻止

Win32 PFXImportCertStore

导入PEM

Microsoft的CLR安全增强功能

Microsoft CNG

以下是在Codeplex上使用.NET dll的Microsoft CNG提供程序的代码(上图)...但是我不知道如何在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格式导出/导入这些值?

1 个答案:

答案 0 :(得分:0)

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