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}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/7389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Embeddings原理、使用方法、优缺点、案例以及注意事项

Embeddings是一种将高维数据映射到低维空间的技术,常用于处理自然语言处理(NLP)和计算机视觉(CV)任务。Embeddings可以将复杂的高维数据转换为低维稠密向量,使得数据可以更容易地进行处理和分析。本文将介绍…

张家界(24-17)

目录 总路线酒店:深圳北->张家界西(day1 07:14~13:45)张家界西(酒店)->张家界森林公园东门(day2 早上)张家界森林公园东门->张家界西(day2 19:48分的高铁)张家界…

leetcode-有重复数字的全排列-98

题目要求 思路 1.同【没有重复项的全排列-97】这个题一样,都是递归的题,区别在于这个可能会包含重复的数字,因此,不能只是简单的通过两个值是否相等然后用标志位标记,而是新增了一个数组,这个数组专门用于…

树和二叉树:二叉树的基本运算算法的实现

一.前言 当前版本仅供笔者复盘 二.二叉树 2.1题目 编写一个程序,实现二叉树的基本运算,具体要求如下:(指定示范实例1:图1。指定示范实例2:图2 ) 1,先序遍历输出该树&#xff08…

Qt QInputDialog详解

1.简介 QInputDialog是一个对话框类,用于从用户那里获取一个单一的值。这个值可以是字符串、数字、或者一个列表中的选项。QInputDialog提供了一个方便的方式来快速创建一个输入对话框,无需自己从头开始构建。 QInputDialog支持多种输入类型&#xff1…

【CTF Web】XCTF GFSJ0475 get_post Writeup(HTTP协议+GET请求+POST请求)

get_post X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗? 解法 用 Postman 发送一个 GET 请求,提交一个名为a,值为1的变量。 http://61.147.171.105:65402/?a1用 Postman 发送一个 POST 请求,提交一个名为b,值为…

【吊打面试官系列】Java高并发篇 - 可以直接调用 Thread 类的 run ()方法么?

大家好,我是锋哥。今天分享关于 【可以直接调用 Thread 类的 run ()方法么?】面试题,希望对大家有帮助; 可以直接调用 Thread 类的 run ()方法么? 当然可以。但是如果我们调用了 Thread 的 run()方法,它的行…

VSCode通过SSH连接虚拟机Ubuntu失败

问题说明 最近使用VSCode通过SSH连接Ubuntu,通过VSCode访问Ubuntu进行项目开发,发现连接失败 在VSCode中进行SSH配置 这些都没有问题,但在进行连接时候出现了问题,如下: 出现了下面这个弹窗 解决方法 发现当…

【c1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,typedef

文章目录 1.数据类型:编译器(compiler)与解释器(interpreter),中文里的汉字和标点符号是两个字节,不能算一个字符(单引号)2.运算符/循环:sizeof/size_t3.数组…

在.NET架构的Winform项目中引入“异步编程”思想和技术

在.NET架构的Winform项目中引入“异步编程”思想和技术 一、异步编程引入(1)异步编程引入背景(2)异步编程程序控制流图(3)异步编程前置知识: 二、异步编程demo步骤1:步骤2&#xff1…

Kafka源码分析(五) - Server端 - 基于时间轮的延时组件

系列文章目录 Kafka源码分析-目录 一. 背景 Kafka内部涉及大量的"延时"操作,比如收到PRODUCE请求后可为副本等待一个timeout的时间后再响应客户端。 那我们讨论一个问题:Kafka为什么自己实现了一个延时任务组件,而不直接使用ja…

微信个人号开发api接口-视频号矩阵接口-VIdeosApi

友情链接:VIdeosApi 获取用户主页 接口地址: http://api.videosapi.com/finder/v2/api/finder/userPage 入参 { "appId": "{{appid}}", "lastBuffer": "", "toUserName": "v2_060000231003b2…

网络基础-华为VRP基础CLI操作

基本命令模式 华为设备的命令行模式包括用户视图和特权级模式。 用户视图(User View):这是用户登录到华为设备时默认进入的模式。在用户视图下,用户可以执行一些基本的查看命令,但不能进行设备配置或管理。提示符通常…

Golang | Leetcode Golang题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; func minDistance(word1 string, word2 string) int {m, n : len(word1), len(word2)dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)}for i : 0; i < m1; i {dp[i][0] i // word1[i] 变成 word2[0], 删掉 word1[i], …

U盘提示“被写保护”无法操作处理怎么办?

今天在使用U盘复制拷贝文件时&#xff0c;U盘出现“U盘被写保护”提示&#xff0c;导致U盘明明有空闲内存却无法复制的情况。这种情况很常见&#xff0c;很多人在插入U盘到电脑后&#xff0c;会出现"U盘被写保护"的提示&#xff0c;导致无法进行删除、保存、复制等操…

Junit 测试中如何对异常进行断言

本文对在 Junit 测试中如何对异常进行断言的几种方法进行说明。 使用 Junit 5 如果你使用 Junit 5 的话&#xff0c;你可以直接使用 assertThrows 方法来对异常进行断言。 代码如下&#xff1a; Exception exception assertThrows(NumberFormatException.class, () -> {n…

pycharm关闭代码补全

pycharm关闭代码补全 文件-设置 编辑器-常规-代码补全-键入时显示建议

pyecharts绘制世界动态轨迹图(v0.5.X与v1.X版本对比)

一、问题引入 pyecharts官网&#xff1a;https://pyecharts.org/#/zh-cn/intro 在使用Geo或者GeoLines绘制动态轨迹图时&#xff0c;如果所选地区是中国的省份或者城市&#xff0c;是能够匹配到对应的经纬度并且正常绘制的&#xff1b;如果所选地区涉及到其他国家或者国外城市&…

监控公司局域网电脑的软件|局域网电脑监控软件哪个好用

想要监控公司局域网电脑&#xff1f;没问题&#xff0c;市面上有一大堆选择等着你&#xff01;每个软件都有它的独门绝技和适用场合&#xff0c;接下来就让我带你看看哪些软件既好用又功能强大吧&#xff01; &#x1f389;OpManager&#xff1a; 这位大佬适合中大型企业&#…

C语言 | Leetcode C语言题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; void setZeroes(int** matrix, int matrixSize, int* matrixColSize) {int m matrixSize;int n matrixColSize[0];int flag_col0 false;for (int i 0; i < m; i) {if (!matrix[i][0]) {flag_col0 true;}for (int j 1; j < n; j…