0

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

4

2 回答 2

1

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

于 2013-03-17T12:15:09.647 回答
0

PBEUtil 支持的 PBE 算法:

PBEwithMD2andDES-CBC, PBEwithMD2andRC2-CBC, PBEwithMD5andDES-CBC, PBEwithMD5andRC2-CBC, PBEwithSHA1andDES-CBC, PBEwithSHA1andRC2-CBC, PBEwithSHA-1and128bitRC4, PBEwithSHA-1and40bitRC4, PBEwithSHA-1and3-keyDESEDE-CBC, PBEwithSHA-1and2-keyDESEDE-CBC, PBEwithSHA- 1 和 128 位 RC2-CBC、PBEwithSHA-1 和 40 位 RC2-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);

    }
于 2013-11-19T14:03:13.557 回答