【问题标题】:Bouncy Castle C# - Password Protect keyBouncy Castle C# - 密码保护密钥
【发布时间】:2012-07-22 04:06:26
【问题描述】:

我可以使用以下代码解密受密码保护的 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 EncryptedPrivateKeyInfo 生成的非PBE 算法。

Google 搜索除了函数的源代码外什么也没有显示,尽管我试图按照它找到我无法找到的解决方案。

谁能指出我如何使用该功能从标准 .net 私钥创建受密码保护的 PKCS8 DER 密钥的正确方向?

【问题讨论】:

标签: c# .net bouncycastle pfx


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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-1and128bitRC2-CBC, PBEwithSHA-1and40bitRC2-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);
    
        }
    

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 1970-01-01
      • 2011-02-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多