簡體   English   中英

Bouncy Castle C#-密碼保護密鑰

[英]Bouncy Castle C# - Password Protect key

我可以使用以下代碼解密受密碼保護的PKCS8 DER密鑰:

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密鑰。 閱讀Bouncy Castle源代碼后,我設法找到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生成一起使用”。

Google搜索除了顯示該函數的源代碼外沒有發現任何東西,盡管我一直嘗試遵循該函數來找到我無法找到的解決方案。

有人可以向我指出正確的方向,如何使用該功能從標准的.net私鑰創建受密碼保護的PKCS8 DER密鑰嗎?

PrivateKeyFactory.EncryptKey的第一個參數應該標識用於加密的算法。 最簡單的方法是提供標准PBE算法的ObjectIdentifier(OID),例如PKCSObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc而不是DerObjectIdentifier.Der。 如果要查看還有哪些其他算法可用,可以看一下PbeUtilities類。

PBEUtil支持的PBE算法:

PBE withMD2和DES-CBC,PBEwithMD2和RC2-CBC,PBEwithMD5和DES-CBC,PBEwithMD5和RC2-CBC,PBEwithSHA1和DES-CBC,PBEwithSHA1和RC2-CBC,PBEwithSHA-1和128bitRC4,PBE withSHA-1和40bitRC4,PBEwithSHA-1和3DESCED,PBEwithSHA-1和3-DES 1和128位RC2-CBC,帶有SHA-1的PBE和40位RC2-CBC,帶有HmacSHA-1的PBE,帶有HmacSHA-224的PBE,帶有HmacSHA-256的PBE,帶有HmacRIPEMD128,PBE帶有HmacRIPEMD160的PBE和帶有HmacRIPEMD256的PBE。

例:

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

        return Convert.ToBase64String(encKey);

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM