2012-06-29 129 views
4

是否可以生成RSA密钥对,将其导出为与DKIM's PEM-like format兼容的ASN1格式,仅使用C# ?使用CngKey使用C#生成与PEM(DKIM兼容)中的RSA密钥对...类似于“openssl rsa”

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

充气城堡

加密应用程序块

的Win32 PFXImportCertStore

导入PEM

微软CLR安全性增强

微软CNG

下面是用在CodePlex上(上图)的.NET的DLL微软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); 
      } 
     } 

问题

是否有使用说明如何创建一个密钥对,并导出/导入PEM格式的值微软的库(Win32的,PFX,或在Codeplex CLR)的任何直接的例子?

+0

PEM并非真正的格式,因此您需要更具体地说明您为什么要使用'PEM格式',以及您希望与之互操作的内容。 –

+1

@GregS我更新的问题。我需要与存储在DNS中的DKIM条目兼容的ASN1格式 – LamonteCristo

+0

这看起来像是对您的问题的回答: http://blogs.msdn.com/b/dcook/archive/2008/11/25/creating-a -self签名证书功能于c.aspx – glagolig

回答

0

所以你只需要密钥的pkcs8然后。现在

CngKeyCreationParameters ckcParams = new CngKeyCreationParameters() 
{ 
    ExportPolicy = CngExportPolicies.AllowExportPlainText, 
    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编码的字符串中。