2024蓝桥杯RSA-Theorem

本文介绍了如何使用Python库yafu和数学方法如prevprime函数来解决RSA密码学中的大整数分解问题,包括直接使用yafu工具、通过prevprime分解n以及使用Cryptodome库进行解密的过程。
摘要由CSDN通过智能技术生成

方法1:直接使用工具yafu解题

yafu的使用方法

安装:解压后直接使用即可,在文件包内,执行命令终端,输入命令行

1、如果数比较小,进入该文件的目录后可以直接使用: yafu-x64 factor(n) 如果是powershell,则使用: .\yafu-x64 factor(n) 2、如果数比较大,那就需要将数保存成一个txt,然后使用,powershell则是在前面加.: yafu-x64 "factor(@)" -batchfile n.txt注意: (1)n为十进制 (2)txt文件结尾必须有一个换行符,如下图: (3)该命令会删除这个txt,请注意保存。

再编写解题代码即可

 
from Crypto.Util.number import *
from gmpy2 import *
​
n = 94581028682900113123648734937784634645486813867065294159875516514520556881461611966096883566806571691879115766917833117123695776131443081658364855087575006641022211136751071900710589699171982563753011439999297865781908255529833932820965169382130385236359802696280004495552191520878864368741633686036192501791
p = 9725277820345294029015692786209306694836079927617586357442724339468673996231042839233529246844794558371350733017150605931603344334330882328076640690156923
q = 9725277820345294029015692786209306694836079927617586357442724339468673996231042839233529246844794558371350733017150605931603344334330882328076640690156717
c = 36423517465893675519815622861961872192784685202298519340922692662559402449554596309518386263035128551037586034375613936036935256444185038640625700728791201299960866688949056632874866621825012134973285965672502404517179243752689740766636653543223559495428281042737266438408338914031484466542505299050233075829
e = 65537
​
phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
# flag{5f00e1b9-2933-42ad-b4e1-069f6aa98e9a}

方法2:使用prevprime分解n

密码方向的签到题,根据题目已知n、e和c,并且p和q是相邻的素数,可以考虑分解。

通过prevprime函数分解n,然后RSA解密即可:

prevprime函数

该Python函数的功能是计算并返回给定正整数n的平方根下方最近的质数。下面是详细的分步解析: 调用gmpy2.iroot(n, 2): gmpy2是一个Python库,专门用于大整数运算和数学相关功能,提供高效的大数处理能力。 iroot(n, 2)函数计算n的二次方根(即n的1/2次方),并尝试给出一个整数结果。如果n是一个完全平方数,它会返回(sqrt(n), True),表示计算出的平方根是精确的;如果不是,则返回(接近sqrt(n)的最大整数, False)。 取平方根计算结果的实数部分: 通过[0],我们只关心计算结果中的实际数值部分,忽略它是否为完全平方数的布尔标记。 寻找前一个质数prevprime(): prevprime(x)是gmpy2库中的一个函数,它接收一个整数x作为输入,然后返回小于或等于x的最大质数。 在我们的函数中,将从步骤2得到的平方根值作为输入,寻找不大于这个平方根的最大质数。 综上所述,整个函数的作用是,对于给定的整数n,先计算其平方根的值,然后找到这个平方根值之前最接近的一个质数,并将这个质数赋值给变量p。这个过程在密码学、数论研究或者需要处理与质数相关的算法中可能会用到。可以用于求解大整数n的分解

from Crypto.Util.number import long_to_bytes
import gmpy2
import libnum
​
from sympy import prevprime
​
e = 65537
n = 94581028682900113123648734937784634645486813867065294159875516514520556881461611966096883566806571691879115766917833117123695776131443081658364855087575006641022211136751071900710589699171982563753011439999297865781908255529833932820965169382130385236359802696280004495552191520878864368741633686036192501791
c = 36423517465893675519815622861961872192784685202298519340922692662559402449554596309518386263035128551037586034375613936036935256444185038640625700728791201299960866688949056632874866621825012134973285965672502404517179243752689740766636653543223559495428281042737266438408338914031484466542505299050233075829
​
# 分解n
p = prevprime(gmpy2.iroot(n,2)[0])
q = n // p
​
# 求d
d = gmpy2.invert(e,(p-1) * (q-1))
​
print(long_to_bytes(pow(c,d,n)))

方法3:预期解

代码中引用了Cryptodome库,我们需要安装一下,安装这个需要搜索pycryptodomex

要不然会报错

这段代码使用了gmpy2库来执行两个操作: gmpy2.isqrt(n): 这个函数计算并返回一个整数,该整数是输入值n的平方根的下界。换句话说,它找到最大的整数x,使得x*x ≤ n。这里n应该是一个非负整数或者高精度整数。此步骤主要用于确定一个数的平方根的整数部分,常用于数学和密码学相关的算法中,比如寻找素数或者确定RSA密钥的大小等场景。 gmpy2.next_prime(x): 接着,将上一步得到的结果作为输入,这个函数计算并返回大于或等于x的下一个素数。如果x本身就是素数,那么返回的就是x本身。这个函数对于寻找大于某个特定数值的最近素数非常有用,比如在加密算法中选择素数作为模数时。 综上所述,整个代码段的作用是从n的平方根的下界开始寻找下一个素数,并将这个素数赋值给变量p。这样的操作可能用于需要精确控制数值大小范围内的素数生成的场合,比如在实现某些密码协议或进行数学研究时

*'''
**该函数的功能是将长整型数字转换为字节序列**,**也就是让输出的数字转为字符输出**flag
**'''
*from Cryptodome.Util.number import long_to_bytes
import libnum
import gmpy2
​
n = 94581028682900113123648734937784634645486813867065294159875516514520556881461611966096883566806571691879115766917833117123695776131443081658364855087575006641022211136751071900710589699171982563753011439999297865781908255529833932820965169382130385236359802696280004495552191520878864368741633686036192501791
d1 = 4218387668018915625720266396593862419917073471510522718205354605765842130260156168132376152403329034145938741283222306099114824746204800218811277063324566
d2 = 9600627113582853774131075212313403348273644858279673841760714353580493485117716382652419880115319186763984899736188607228846934836782353387850747253170850
c = 36423517465893675519815622861961872192784685202298519340922692662559402449554596309518386263035128551037586034375613936036935256444185038640625700728791201299960866688949056632874866621825012134973285965672502404517179243752689740766636653543223559495428281042737266438408338914031484466542505299050233075829
e = 65537
​
p = gmpy2.next_prime(gmpy2.isqrt(n))
q = n // p
print(p)
print(q)
​
phi = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi)
​
print(long_to_bytes(pow(c,d,n)))
# flag{5f00e1b9-2933-42ad-b4e1-069f6aa98e9a}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值