每日10行代码171:rsa问题,转换为用python解大整数的一元二次方程

176 篇文章 4 订阅
6 篇文章 0 订阅

接上一章,其实还有另一种方法分解p和q,因为根据条件可设:
p=11x+t
q=23x-m
p ∗ q = 253 x 2 + ( 23 t − 11 m ) x − t m p*q=253x^2+(23t-11m)x-tm pq=253x2+(23t11m)xtm
可以得一元二次方程:
253 x 2 + ( 23 t − 11 m ) x + ( − t m − n ) = 0 253x^2+(23t-11m)x+(-tm-n)=0 253x2+(23t11m)x+(tmn)=0
其中t和m均为一个2000以内的较小值,所以我可以用穷举的方法,逐一产生方程并求解,求得的解x即为第一个素数,p,q都是基于x生成的。

import math
import gmpy2
print("----计算一元二次方程的根----")
n= 7099293997597057840121358666833837753498838275854020154482887743106000287292796543920866875062689995360025217485874831332257233130287943206444475190268445255670322843664471682348256156185175655765790452094332875022809494407318056044647005041845654843080303742522260061500210481600297956451426162674923926908156645992521694195572818623774054219194331159529364179241757932761459930262573830738911713799216140111007655256112125121081747854267340976432923900792983659847629430766080521995039114172477341269935779097804051557556063477903826454634581880779164839924381664510909546228996769947966559112620828323435423467787739
a = 253


def judge_resutl(x,t,m):
    judgeA=(x[1]==0)
    judgeB = gmpy2.is_prime(x[0]*11+t)
    judgeC = gmpy2.is_prime(x[0]*23-m)
    
    return judgeA and judgeB and judgeC


for t in range(1,2000):
    for m in range(1,2000):
        b=23*t-11*m
        c= -m*t-n
        d=b**2-4*a*c
        #print(d)
        e=gmpy2.iroot(d, 2)
        if e[1]==True:
            #print(t,m)
            x1 = divmod(-b+e[0],2*a)
            x2 = divmod(-b-e[0],2*a)
            if judge_resutl(x1,t,m):
                print("p等于:",x1[0]*11+t)
                print("q等于:",x1[0]*23-m)
                break
            if judge_resutl(x2,t,m):
                print("p等于:",x2[0]*11+t)
                print("q等于:",x2[0]*23-m)
                
    else:
        #print('tttt')
        continue
    break      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值