RSA加密:负面解决方案似乎太大而无法使用

时间:2017-04-19 00:27:35

标签: encryption cryptography rsa

我实现了功能最强大的RSA加密。它随机生成2048位素数 p q n = pq ),大部分时间我得到一个相对较小的值 d 正如所料。值d用于加密 M ^ d mod n。

但是,有时我得到的 d 的值是负数,这在RSA中通常是不受欢迎的。经过一些研究,我发现一个常见的解决方案是在这种情况下简单地添加 phi (phi =(p-1)(q-1))。

d = d % phi;
if(d < 0)
    d += phi;

但是当我这样做时,我最终得到的 d n (超过2048位)一样大。这似乎太大了,无法发挥作用。我有什么遗漏的东西,或者 d 的值是否真的可以接受?

2 个答案:

答案 0 :(得分:4)

  

加密M ^ d mod n。

你要么使用非标准符号来混淆人们(也可能是你自己),或者对RSA如何运作感到困惑。加密使用公共指数,它通常写为 e 。解密使用私有指数,它通常写为 d 。一旦不使用 d 加密。任何人都可以加密;解密是需要私人秘密的。

  

我得到了一个相对较小的值d

不,预计不会获得 d 的小值。公共指数 e 通常被选为常数;原则上,在2和 n -1之间的任何奇数都可以,但是你可以选择一个小的,其中几个位设置为1以获得性能(3和65537是最常用的值)。私有指数 d 是根据素数计算的,预计不会很小。它应该与 n 一样大。如果 d 太小,那么系统将是不安全的(如果 d 非常小以至于可以猜到它,那么它显然是不安全的,并且除此之外还有更微妙的数学漏洞)

  

在实践中将某些东西提升到1024位的功率似乎很荒谬。

不,这就是RSA的工作方式。 (除非现在1024位太小,否则2048是安全性最低的。)

  

有时d得到的值是负的

指数 d e 是模 phi n )的值,这意味着您可以添加或减去 phi n )的倍数,它不会改变计算。但是,使用负值是非常不寻常的;通常所有计算都保持在[0, n -1]的范围内。如果你得到一个负值,你就会在某个地方做一些不寻常的事情。

答案 1 :(得分:0)

我无法回答您问题的技术部分,但遇到了同样的问题,如果 我们有

ed = 1 (modulo phi)

差是phi的倍数:

ed - 1 = Q*phi

所以我们可以在两边添加e*phi

e(d + phi) - 1 = (Q + e)*phi

e(d + phi) = 1 (modulo phi)

因此,当 d 为负数时,我们可以添加 phi 并使其为正数。