偶然见到了一个关于RSA的题目,Python代码如下(侵删):
import gmpy2 as gmp
from gmpy2 import mpz
def rsa_keygen (N):
'''To generate RSA key pair
of size N bits '''
UB = 2**( N // 2) - 1
LB = 2**(( N // 2) - 1)
status = True
p = rand_n (LB , UB)
p = gmp . next_prime (p)
q = gmp . next_prime (p)
e = mpz (65537)
n = mpz (p * q)
phi_n = mpz ((p - 1) * (q - 1))
if gmp . gcd (e, phi_n ) == 1:
d = gmp . invert (e, phi_n )
else :
status = False
d = -1
return status , n, e, d
函数rsa_keygen函数生成长度为N的p,然后将p设置为p的下一个素数,q设置成p的下一个素数。
如果我们了解孪生素数猜想和张益唐的成果,使用上面的方法,生成的p和q,距离是比较近的。
下面摘自百度百科:
由希尔伯特在1900年国际数学家大会的报告上第8个问题中提出,可以这样描述:
存在无穷多个素数p,使得p + 2是素数。
张益唐证明了存在无穷多对素数,其差小于7000万。后来这个数字被证明到了246,因此,我们可以猜想,上面的函数生成的素数p和q,距离是比较近的。因此,分解n是有很大可能的。
yafu是一个大数分解工具,链接:yafu
yafu用于自动整数因式分解,在RSA中,当p和q相差过大或过小时,yafu可以快速分解。
因此,上面的代码是有漏洞的。