更具体地说,gmpy2.next_prime函数是否足够好以找到所需的大素数?还是应该使用其他多个gmpy2.*_prp函数之一?
例如,下面的代码是否足以为加密找到合适的素数?
import os
import gmpy2
def random(bytez):
seed = reduce(lambda a, b: (a << 8)|ord(b), os.urandom(bytez), 0)
return gmpy2.mpz_urandomb(gmpy2.random_state(seed), bytez*8)
def find_prime(bytez=128):
p = random(bytez)|1
while not gmpy2.is_bpsw_prp(p):
p = random(bytez)|1
return p
def good_pair(p, q):
n = p*q
k = gmpy2.ceil(gmpy2.log2(n))
if abs(p - q) > 2**(k/2 - 100):
return n
return 0
def make_rsa_keypair():
p, q = find_prime(), find_prime()
n = good_pair(p, q)
while not n:
p, q = find_prime(), find_prime()
n = good_pair(p, q)
tot = n - (p + q - 1)
e = (1 << 16) + 1
d = gmpy2.invert(e, tot)
return {
'public':{
'n':n,
'e':e,
},
'private':{
'n':n,
'd':d,
}
}UPDATE:使用建议更新代码。
发布于 2015-03-11 22:03:16
免责声明:我维护gmpy2。
我建议使用gmpy2.is_bpsw_prp而不是gmpy2.next_prime。BPSW测试将更快,也没有已知的反例.is_prime和next_prime检查过去和现在仍然使用一组固定的基座,并且可以组合通过一系列已知的测试。有人发现一个合成物通过了前17次检查。默认情况下,完成了25次检查,但这是一个弱点。
我计划在下一个版本的gmpy2中包括一个APR可证明的原始性测试。
对于选择RSA素数有一些具体的指导方针,应该遵循这些准则,以防止意外地选择创建一个可以很容易被考虑的n的素数。
https://stackoverflow.com/questions/28997364
复制相似问题