Bouncy Castle C#-密码保护密钥

Bouncy Castle C#-密码保护密钥,c#,.net,bouncycastle,pfx,C#,.net,Bouncycastle,Pfx,我可以用以下代码解密受密码保护的PKCS8 DER密钥: MemoryStream ms = new MemoryStream(privateKey); AsymmetricKeyParameter keyparams = Org.BouncyCastle.Security.PrivateKeyFactory.DecryptKey(password.ToCharArray(), ms); RSAParameters rsaparams = DotNetUtilities.ToRSAP

我可以用以下代码解密受密码保护的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生成一起使用”

谷歌搜索除了该函数的源代码外,什么都没有透露,尽管我试图按照它来寻找解决方案,但我一直无法找到


有人能告诉我如何使用该函数从标准.net私钥创建受密码保护的PKCS8 DER密钥吗?

PrivateKeyFactory.EncryptKey的第一个参数应该是识别要加密的算法。最简单的方法是给出标准PBE算法的ObjectIdentifier(OID),例如PKCSObjectIdentifiers.pbewithsha和3keyTripleDescbc,而不是DerObjectIdentifier.Der。如果您想了解其他可用的算法,可以查看PbeUtilities类。

PBEUtil支持的PBE算法:

PBEWITHD2和DES CBC,PBEWITHD2和RC2 CBC,PBEWITHD5和DES CBC,PBEWITHH1和DES CBC,PBEWITHH1和C2 CBC,PBEwithSHA-1和128BITRC4,PBEwithSHA-1和40BITRC4,PBEwithSHA-1和3-keyDESEDE-CBC,PBEwithSHA-1和2-keyDESEDE-CBC,PBEwithSHA-1和128BITRC2-CBC,PBEwithSHA-1和40BITTHSHA-ACH,PBTHSHA-224,PBEWITHmACSHA-256、PBEWITHmACRIPEMD128、PBEWITHmACRIPEMD160和PBEWITHmACRIPEMD256

例如:

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

        return Convert.ToBase64String(encKey);

    }
PrivateKeyToPKCS8方法