RSA导入手动RSAParams失败,数据错误

时间:2014-11-12 18:50:32

标签: c# rsa

我整个上午一直在这里,仍然无法弄清楚我错过了什么。

我正在尝试使用自己生成的值执行RSA加密。有几个SO帖子,有几个让我走得更远。其中一些帖子有OP放弃和使用BouncyCastle或其他东西,而有答案和评论说它确实有效。因此,我有点决心学习他们所知道的知识并使.Net RSACryptoServiceProvider工作。

所以为此我在这里有一个简单的小样本,我甚至无法导入RSAParameters。

我还没有发布用于生成和测试素数或我的e值的代码。我可以,如果需要,但我不认为这是故障,因为它是相当的股票代码。

BigInteger p = BigInteger.Parse("17234...948417"); //Large Prime A
BigInteger q = BigInteger.Parse("16750...157759"); //Large Prime B
BigInteger n = BigInteger.Multiply(p, q); //Modulus
BigInteger e = BigInteger.Parse("16168...372355");

RSAParameters _rsaParams new RSAParameters();
_rsaParams.Modulus = n.ToByteArray();
_rsaParams.Exponent = e.ToByteArray();

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(_rsaParms);

Breakpoint Inspection

当然是例外。

enter image description here


好的,基于@ Iridium的回答,我加倍了我如何计算公共指数,我确实做错了,因此提出了太大的公众指数。在我对正确方法的研究中,我发现这个非常有用的网站来计算我能够检查自己并找到错误的指数。

  

http://nmichaels.org/rsa.py

1 个答案:

答案 0 :(得分:2)

我记得,RSACryptoServiceProvider在导入的参数中不接受大于4个字节的Exponent(即使字节数组所表示的数字适合较小的字段,即通过添加前导零字节)。你的指数似乎是129个字节,显然超过了这个限制。

如果您使用的指数实际上是私有指数,那么使其与.NET RSACryptoServiceProvider一起使用的唯一方法是填写其余字段({{ 1}},PQDPDQ)正确,并将InverseQ设置为通常小得多的公共指数。