一个RSA破解的例子

偶然见到了一个关于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是素数。

素数对(pp + 2)称为孪生素数

张益唐证明了存在无穷多对素数,其差小于7000万。后来这个数字被证明到了246,因此,我们可以猜想,上面的函数生成的素数p和q,距离是比较近的。因此,分解n是有很大可能的。

yafu是一个大数分解工具,链接:yafu

yafu用于自动整数因式分解,在RSA中,当p和q相差过大或过小时,yafu可以快速分解。

因此,上面的代码是有漏洞的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值