2012-07-22 55 views
0

我可以解密密碼保護PKCS8 DER鍵下面的代碼:充氣城堡C# - 密碼保護關鍵

MemoryStream ms = new MemoryStream(privateKey); 
AsymmetricKeyParameter keyparams =  Org.BouncyCastle.Security.PrivateKeyFactory.DecryptKey(password.ToCharArray(), ms); 
RSAParameters rsaparams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)keyparams); 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
rsa.ImportParameters(rsaparams); 
return rsa;   

現在,我必須重新創建同一類型的鍵時,它給我以不同的格式(在這個例子中它是作爲PFX文件給予我的)。所以我必須從PFX私鑰中創建一個密碼保護的PKCS8 DER密鑰。閱讀充氣城堡的源代碼後,我設法找到了PrivateKeyFactory.EncryptKey功能,但我不能得到它的工作。我的代碼如下:

X509Certificate2 cert = new X509Certificate2(pfx_bytes, password,X509KeyStorageFlags.Exportable);    
var pkey = cert.PrivateKey; 
var bcCert = DotNetUtilities.FromX509Certificate(cert);  
var bcPkey = DotNetUtilities.GetKeyPair(pkey).Private; 
return PrivateKeyFactory.EncryptKey(Org.BouncyCastle.Asn1.DerObjectIdentifier.Der, password.ToCharArray(), Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()), 10, bcPkey); 

當我運行上面的代碼中,我得到的異常"System.ArgumentException:嘗試使用非PBE算法PBE EncryptedPrivateKeyInfo一代」

谷歌搜索顯示沒有什麼,除了功能的源代碼,雖然我試圖順藤摸瓜找到解決方案我一直沒能來。

可有人請點我在正確的方向,我怎麼可以使用功能創建密碼保護PKCS8 DER密鑰來自標準.net私鑰?

+0

http://www.codeproject.com/Articles/25487/Cryptographic-Interoperability-Keys PrivateKeyToPKCS8方法或許 – m0s 2012-07-22 07:59:54

回答

1

的第一個參數PrivateKeyFactory.EncryptKey應該識別算法來加密。最簡單的方法是給標準PBE算法的ObjectIdentifier(OID),例如PKCSObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc代替DerObjectIdentifier.Der。如果您想查看其他可用算法,則可以查看PbeUtilities類。通過PBEUtil支持

0

PBE算法:

PBEwithMD2andDES-CBC,PBEwithMD2andRC2-CBC,PBEwithMD5andDES-CBC,PBEwithMD5andRC2-CBC,PBEwithSHA1andDES-CBC,PBEwithSHA1andRC2-CBC,PBEwithSHA-1and128bitRC4,PBEwithSHA-1and40bitRC4,PBEwithSHA-1and3- PBE withHmacSHA-256,PBEwithHmacRIPEMD128,PBEwithHmacRIPEMD160,和PBEwithHmacRIPEMD256,PBE與HmacSHA-224,PBE與HmacSHA-224,PBE與HmacSHA-256,PBE與HmacRIPEMD128,PBE與HmacRIPEMD160以及PBE與HmacRIPEMD256組成。

實施例:

private static string EncryptPrivateKey(AsymmetricKeyParameter privateKey) 
    { 
     var encKey = PrivateKeyFactory.EncryptKey("PBEwithSHA1andDES-CBC", "test".ToCharArray(), 
                 new byte[256], 1, privateKey); 

     return Convert.ToBase64String(encKey); 

    }