Bouncy Castle C# - 密码保护密钥

时间:2012-07-22 04:06:27

标签: c# .net bouncycastle pfx

我可以使用以下代码解密受密码保护的 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 密钥吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

PBEUtil支持的PBE算法:

PBE withMD2andDES-CBC,PBEwithMD2andRC2-CBC,PBEwithMD5andDES-CBC,PBEwithMHA5andDES-CBC,PBEwithSHA1andRC2-CBC,PBEwithSHA-1和128bitRC4,PBEwithSHA-1和40bitRC4,PBEwithSHA-1和3-keyDESEDE-CBC,PBEwithSHA-1和2-keyDESEDE-CBC ,PBEwithSHA-1和128bitRC2-CBC,PBEwithSHA-1和40bitRC2-CBC,PBEwithHmacSHA-1,PBEwithHmacSHA-224,PBEwithHmacSHA-256,PBEwithHmacRIPEMD128,PBEwithHmacRIPEMD160,PBEwithHmacRIPEMD256。

示例:

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

        return Convert.ToBase64String(encKey);

    }