2024蓝桥杯RSA-Theorem

简介: 2024蓝桥杯RSA-Theorem

方法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}
相关文章
|
安全 数据安全/隐私保护
BUUCTF webshell后门 1
BUUCTF webshell后门 1
664 0
|
Java 关系型数据库 MySQL
网络安全-JDBC反序列化漏洞与RCE
网络安全-JDBC反序列化漏洞与RCE
644 0
|
数据安全/隐私保护 Python
BUUCTF [ACTF新生赛2020]base64隐写 1
BUUCTF [ACTF新生赛2020]base64隐写 1
927 0
BUUCTF [ACTF新生赛2020]base64隐写 1
|
存储 Linux Android开发
Volatility3内存取证工具安装及入门在Linux下的安装教程
Volatility 是一个完全开源的工具,用于从内存 (RAM) 样本中提取数字工件。支持Windows,Linux,MaC,Android等多类型操作系统系统的内存取证。针对竞赛这块(CTF、技能大赛等)基本上都是用在Misc方向的取证题上面,很多没有听说过或者不会用这款工具的同学在打比赛的时候就很难受。以前很多赛项都是使用vol2.6都可以完成,但是由于操作系统更新,部分系统2.6已经不支持了,如:Win10 等镜像,而Volatility3是支持这些新版本操作系统的。
2550 0
|
8月前
|
人工智能 Java 程序员
一文彻底拿下@State和@Prop和@Link的区别和联系
程序员Feri,12年+开发经验,专注于Java、嵌入式、鸿蒙、AI等领域,助力程序员成长。本文详解HarmonyOS装饰器:@State用于组件内部状态管理,状态变化触发重渲染;@Prop实现父组件向子组件单向数据传递,数据只读;@Link支持双向绑定,父子组件共享数据。掌握这些特性,让开发更高效!
372 8
一文彻底拿下@State和@Prop和@Link的区别和联系
|
设计模式 Java
Java责任链模式
Java责任链模式
181 0
抓包工具 Fiddler 抓取 exe 包
抓包工具 Fiddler 抓取 exe 包
1472 0
|
网络安全
2024年---蓝桥杯网络安全赛道部分WP
2024年---蓝桥杯网络安全赛道部分WP
|
开发框架 安全 .NET
Web安全-一句话木马
Web安全-一句话木马
813 5
|
索引 Python
Python中的find()和count()方法详解
Python中的find()和count()方法详解
568 3