2024蓝桥杯RSA-Theorem

ops/2024/9/25 19:16:27/

方法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}


http://www.ppmy.cn/ops/35739.html

相关文章

K8S Redis-Cluster安装(含redis-cluster-proxy、RedisInsight)

参考:在 K8S 中快速部署 Redis Cluster & Redisinsight 参考:Redis 中文文档(一) helm redis-cluster [rootk8s-master01 redis-cluster]# helm search repo redis-cluster NAME CHART VERSION APP …

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑热储灵活配置与热网水力热力特性的电热综合能源系统优化规划》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

tomcat-以服务的方式重启tomcat

背景 双击tomcat的bin目录下面的startup.bat,会留下一个cmd的窗口,很不优雅 使用service服务的方式启动,并且设置为自动启动 找到tomcat的bin目录输入cmd,按Enter,进入命令行界面。执行“service.bat install” 。&…

前端axios发get请求,后端springboot接收不到参数且返回400

这是我的前端请求 import service from "/utils/axios";login(userInfo){return service.get(/login,{param:userInfo});}, 这是我的后端接收 RequestMapping(value"/login",methodRequestMethod.GET)ResponseBodypublic Map<String, Object> logi…

cmake进阶:文件操作之写文件

一. 简介 cmake 提供了 file() 命令可对文件进行一系列操作&#xff0c;譬如读写文件、删除文件、文件重命名、拷贝文件、创建目录等等。 接下来 学习这个功能强大的 file() 命令。 本文学习 CMakeLists.txt语法中写文件操作。 二. cmake进阶&#xff1a;文件操作之写文件…

艾体宝方案 | 加密USB金融解决方案

在现代金融行业中&#xff0c;保护敏感数据和合规性已成为至关重要的任务。为了帮助金融公司应对移动性风险和合规挑战&#xff0c;我们提供了一种高效的加密USB解决方案。 一、为什么金融公司需要加密USB解决方案 1、降低移动性风险 金融服务公司正在迅速过渡到一种模式&a…

链表-203.移除链表元素

203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head [], val 1 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff…

<网络安全>《78 概念讲解<第十一课 物联网常用协议-(近距离蜂窝通信)网络层协议>》

协议简称全称名称内容说明2G/3G/4G分别指第二、三、四代移动通信系统协议。5G第五代移动通信技术最新一代蜂窝移动通信技术。5G的性能目标是高数据速率、减少延迟、节省能源、降低成本、提高系统容量和大规模设备连接。NB-IOTNarrow Band Internet of Things窄带物联网万物互联…