我实现了功能最强大的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 的值是否真的可以接受?
答案 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 并使其为正数。