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

goo*_*ate 5 c# rsa certificate pem

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

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

充气城堡

密码学应用程序块

Win32 PFXImportCertStore

导入PEM

微软的CLR安全增强功能

微软CNG

以下是在Codeplex上使用.NET dll的Microsoft CNG提供程序的代码(上图)...但是我不知道如何以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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

Row*_*ith 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));
}
Run Code Online (Sandbox Code Playgroud)

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