对于 RSA,我如何计算秘密指数?

Posted

技术标签:

【中文标题】对于 RSA,我如何计算秘密指数?【英文标题】:For RSA, how do i calculate the secret exponent? 【发布时间】:2011-03-13 16:28:19 【问题描述】:

给定 p 和 q 两个素数,以及 phi=(p-1)(q-1) 和公共指数 (0x10001),我如何获得秘密指数 'd'?

我读到我必须这样做:d = e-1 mod phi 使用 modular inversion 和 euclidean equation 但我无法理解上述内容公式映射到模块化反演 wiki 页面上的 a-1 ≡ x mod m 公式,或者它如何映射到欧几里德 GCD 方程。

有人可以帮忙吗,干杯

【问题讨论】:

至少在 java 中看起来像,我需要的只是 d=(java.math.BigInteger)e.modInverse(phi); 是的,应该这样做......祝你好运! 我投票结束这个问题,因为它是数学,而不是编程。 【参考方案1】:

你可以用extended Euclidean algorithm解出同余中的d

de = 1 mod phi(m)

对于 RSA 加密,e 是加密密钥,d 是解密密钥,加密 和解密均由取幂 mod m 执行。如果您加密消息a 使用密钥e,然后使用密钥d 对其进行解密,您计算 (ae)d = ade mod @987654332 @。但 因为de = 1 mod phi(m),Euler's totient theorem 告诉我们 ade 是全等的 到一个1 mod m -- 换句话说,你得到了原来的a

没有已知的有效方法来获取解密密钥d,只知道 加密密钥e 和模数m,不知道分解m = pq,所以 RSA 加密被认为是安全的。

【讨论】:

我对这里的代码很幸运:en.wikipedia.org/wiki/… 只需向该函数输入 a=e, b=phi 即可得到 x,y - y 被丢弃,x 是秘密指数 d ! @Chris:很遗憾 Euler 和 Euclid 没能活下来以收取他们在专利收入中的份额。这么久,感谢所有的数学! 为了完整起见,另一种具有相同基本性能的计算方法是 d = e**(phi(phi(m))-1) mod phi(m)。 @GregS:身份成立,但我不同意性能具有可比性。用欧几里得算法找到一个逆 mod n 可以在 O(log n) 时间内完成。但是找到 phi(n) 与分解 n 一样困难,对于任何 k 都没有已知的 O( (log n)^k ) 算法。如果原始 p 和 q 选择得当,(p-1) 和 (q-1) 本身就会有很大的素因数,使得 phi(phi(m)) 难以计算。 @Jim:同意,你必须知道 phi(phi(m)) 否则毫无意义。如果 p-1=2*p' 和 q-1=2*q',其中 p' 和 q' 是素数,则 phi(phi(m)) 是 2*p'*q'。这样的 p 和 q 称为安全素数,在 RSA 实现中很常见(尽管没有必要)。

以上是关于对于 RSA,我如何计算秘密指数?的主要内容,如果未能解决你的问题,请参考以下文章

使用中国剩余定理CRT对RSA运算进行加速

OpenSSL 生成 RSA 公钥时,默认指数为 65535,如何更改?

.net 中 RSA 公钥模数和指数的格式是啥?

RSA:在给定公钥的情况下获取指数和模数

Window CryptoAPI:我可以在生成 RSA 密钥对时选择公共指数吗?

使用 65537 以外的公共指数生成 RSA 密钥(十六进制中的 0x10001)