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

使用C#..在PEM(DKIM兼容)中使用CngKey生成RSA密钥对。。。。类似于;openssl rsa";,c#,certificate,rsa,pem,C#,Certificate,Rsa,Pem,是否可以生成RSA密钥对,仅使用C#将其导出为与兼容的ASN1格式 我想减少对第三方的依赖,但我发现了一些 弹跳城堡 加密应用程序块 Win32 PFXImportCertStore 导入PEM 此代码仅导入PEM数据,但与OpenSSL不同,它修复了.NET 4.0和密钥中前导零的问题 微软的CLR安全增强功能 微软CNG 以下是在codeplex上带有.NET dll的Microsoft CNG提供程序的代码(如上)。。。但是,我不知道如何在中导出和导入

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

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

弹跳城堡

加密应用程序块

Win32 PFXImportCertStore

导入PEM

  • 此代码仅导入PEM数据,但与OpenSSL不同,它修复了.NET 4.0和密钥中前导零的问题
微软的CLR安全增强功能

微软CNG

以下是在codeplex上带有.NET dll的Microsoft CNG提供程序的代码(如上)。。。但是,我不知道如何在中导出和导入公钥和私钥

问题


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

因此,您只需要密钥的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编码字符串中。

PEM实际上不是一种格式,因此您需要更具体地说明为什么需要“PEM格式”,以及希望与什么进行交互。@GregS我更新了问题。我想要与DNST中存储的DKIM条目兼容的ASN1格式。这看起来像是对您问题的回答:
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));
}