【发布时间】:2022-01-05 12:50:01
【问题描述】:
我实际上是在尝试解决密码设置 5 挑战 39。我正在尝试为一些较大的素数 p 和 q,e = 3 实施 RSA。我对此感到困惑几个小时.
为了生成素数,我使用 API 来获取每个素数。我一直生成 p 直到 gcd(p - 1, e) == 1,然后重复 q 直到 gcd(q - 1, e) == 1。我已经测试了 gcd((p - 1) * (q - 1), e) == 1。例如,我最终得到 p == 16226322033026808497 和 q == 14712923008023747557。
然后我进行简单的 RSA 数学运算来计算其他项,加密消息 42(无填充),解密该密码,并将生成的明文与原始消息进行比较。我已经生成了很多很多 ps 和 qs,但它永远不会匹配。
有人能解释一下为什么这不起作用,请帮我生成一些好的参数吗?
Python:
p = 16226322033026808497
q = 14712923008023747557
e = 3
print(f'1 == gcd(p - 1, e) == {gcd(p - 1, e)}')
print(f'1 == gcd(p - 1, e) == {gcd(q - 1, e)}')
phi = (p - 1) * (q - 1)
print(f'phi == {phi}')
print(f'1 == gcd(phi, e) == {gcd(phi, e)}')
n = p * q
print(f'n == {n}')
d = invmod(e, phi)
print(f'd == {d}')
print(f'1 == (d * e) % phi == {(d * e) % phi}')
m = 42
c = pow(m, e, n);
print(f'c == m**e % n == {c}')
p = pow(c, d, n);
print(f'p == c**d % n == {p}')
输出:
1 == gcd(p - 1, e) == 1
1 == gcd(p - 1, e) == 1
phi == 238736626775322802092761613952260035776
1 == gcd(phi, e) == 1
n == 238736626775322802123700858993310591829
d == 159157751183548534728507742634840023851
1 == (d * e) % phi == 1
c == m**e % n == 74088
p == c**d % n == 145835535613124975159078105657928869819
【问题讨论】:
-
选择足够小的
p和q以手动完成它,然后将您的结果与程序输出的结果进行比较。这应该可以帮助您缩小问题所在。 -
我用 p = 11, q = 23, e = 3 测试过。没问题。我在某处发现 p = 3372213049, q = 3372213067, e = 6557。没问题,但我想要 e = 3。另外,我正在上面的代码中运行我所知道的所有检查(对于互质) - 我错过了什么?
-
好吧,如果你选择
p和q作为素数会有所帮助:你的p == 1969260091 * 8239806467和你的q == 1756690123 * 8375366159。 -
素数测试你是怎么做的?!
-
我用过
sympy.primefactors。