我正在编写脚本以向我提供RSA公钥和私钥。我试图计算'e'和'd'的值,其中ed = 1mod64。我知道值将是e = 5和d = 13。我有两个素数列表,最多64个,我想将这些列表相乘以计算'e'和'd'。我相信它会涉及一个while循环,所以,虽然值不是65继续。我正在努力编写这段代码但是我不知道如何让列表不是并行计算。如果有人问过这个问题但是我已经在圈子里进行了很长时间的道歉,如果有人请求,请发布链接,我将删除这个问题。
答案 0 :(得分:1)
我是itertools
模块的粉丝,所以这是一个使用它的例子。
的Python:
import itertools
primes = [2, 3, 5, 7]
for p, q in itertools.combinations(primes,2):
print ((p,q))
输出是:
(2, 3)
(2, 5)
(2, 7)
(3, 5)
(3, 7)
(5, 7)
的Python:
primes = [2, 3, 5, 7, 11, 13, 17, 19]
for e, d in itertools.combinations(primes,2):
if (e*d) % 64 == 1:
print ((e,d))
输出:
(5,13)
请注意,一般来说,这是一种非常低效的查找模块化逆的算法。相反,您应该使用某种版本的扩展欧几里德算法来处理大于玩具大小的参数。
答案 1 :(得分:0)
1 = ed mod m相当于表示存在整数k,使得1 + k m = ed。 既然你正在寻找积极的d&lt; m,也可以观察到k <即因此,以下代码应该起作用
def invm(e,m):
for k in range(e):
if (k*m + 1) % e == 0:
return (k*m+1)//e
只要e很小,这是合理有效的。因此,这甚至适用于大多数实际大小的RSA密钥,因为大多数RSA密钥使用e = 65537。