【问题标题】:Import RSA key from bouncycastle sometimes throws "Bad Data"从 bouncycastle 导入 RSA 密钥有时会抛出“错误数据”
【发布时间】:2015-02-06 16:32:38
【问题描述】:

有时(经常会成为 .NET 和充气城堡之间的严重问题),由 bouncycastle 生成的密钥不会导入到 dotnet RSA 加密提供程序中。

它只会抛出 "Données Incorrectes" ;没有更多细节。 (“坏数据”)。我无法调试问题,因为有罪的函数实现似乎隐藏在 CLR 中(Utils._ImportKey();参考源 RSACryptoServiceProvider.cs:297)。

我尝试更改“提供者”但没有成功。

这里也有同样的问题。通过改变 key 或 keysize 有点解决BouncyCastle RSAPrivateKey to .NET RSAPrivateKey;它在我的单元测试中失败,密钥大小从 512 位到 2048 位不等。

如何解决/调试此类问题? 不良数据是什么意思?

这是一个值失败的测试用例:

[TestCase(
        "3130061425891827008704201520933220266588903615593292093008732204896232681270200769431823371565724812996700795538563485957721923348815282268698793938491993",//mod
        "65537",//pe
        "3130061425891827008704201520933220266588903615593292093008732204896232681270200769431823371565724812996700795538563485957721923348815282268698793938491993",//priv e
        "108172619413453999338304010966268975159507181290909920458641813606026415083917",//p
        "75249617574313725168879024231390763478340191084309820124417146187514704207891",//q
        "46308055148448439895562160789624828220320330169183342667312429963694967752481", //dp
        "237677507940292370873826357872619864199100043554818389089435727311526981263", //dq
        "4755193289666548078142536433103759575424135202658906348751587662200087509503"//qinv
    )]
    public void TestBadKeyForMicrosoft(string mo, string pe, string prive, string p, string q, string dp, string dq, string qinv)
    {
        var k = new RsaPrivateCrtKeyParameters(
            new BigInteger(mo),//mod
            new BigInteger(pe),//pe
            new BigInteger(prive),//priv e
            new BigInteger(p),//p
            new BigInteger(q),//q
            new BigInteger(dp),//dp
            new BigInteger(dq),//dq
            new BigInteger(qinv)//qinv
            );

        var dotNetRsa = Org.BouncyCastle.Security.DotNetUtilities.ToRSAParameters(k);
        //var rsaCsp = new RSACryptoServiceProvider(new CspParameters(24 /*PROV_RSA_AES */)) { PersistKeyInCsp = false };
        var rsaCsp = new RSACryptoServiceProvider() {PersistKeyInCsp = false};
        rsaCsp.ImportParameters(dotNetRsa);
    }

【问题讨论】:

    标签: c# rsa bouncycastle


    【解决方案1】:

    我猜这只是一个填充问题。

    Bouncy-castle 最新的 GIT 版本代码如下:

    nb:在“Nuget”版本(2011)中没有修复它

    public static RSAParameters ToRSAParameters(RsaPrivateCrtKeyParameters privKey)
    {
       RSAParameters rp = new RSAParameters();
       rp.Modulus = privKey.Modulus.ToByteArrayUnsigned();
       rp.Exponent = privKey.PublicExponent.ToByteArrayUnsigned();
       rp.P = privKey.P.ToByteArrayUnsigned();
       rp.Q = privKey.Q.ToByteArrayUnsigned();
       rp.D = ConvertRSAParametersField(privKey.Exponent, rp.Modulus.Length);
       rp.DP = ConvertRSAParametersField(privKey.DP, rp.P.Length);
       rp.DQ = ConvertRSAParametersField(privKey.DQ, rp.Q.Length);
       rp.InverseQ = ConvertRSAParametersField(privKey.QInv, rp.Q.Length);
       return rp;
    }
    
    private static byte[] ConvertRSAParametersField(BigInteger n, int size)
    {
       byte[] bs = n.ToByteArrayUnsigned();
       if (bs.Length == size)
          return bs;
       if (bs.Length > size)
          throw new ArgumentException("Specified size too small", "size");
       byte[] padded = new byte[size];
       Array.Copy(bs, 0, padded, size - bs.Length, bs.Length);
       return padded;
    }
    

    此代码不同于您在其他任何地方看到的基本上复制/粘贴关键参数且不执行额外填充步骤的代码。

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多