buuctf的RSA(五)

[RoarCTF2019]RSA

     一看到题目,我就有些蒙了,A是代表了什么,

先来分解n

接下来可以暴力破解e了,因为e没有给出来,应该不会太大,猜测是四位数字


import gmpy2
import libnum
from Crypto.Util.number import long_to_bytesA = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128print(len(str(A)))q = 842868045681390934539739959201847552284980179958879667933078453950968566151662147267006293571765463137270594151138695778986165111380428806545593588078365331313084230014618714412959584843421586674162688321942889369912392031882620994944241987153078156389470370195514285850736541078623854327959382156753458569
p = 139916095583110895133596833227506693679306709873174024876891023355860781981175916446323044732913066880786918629089023499311703408489151181886568535621008644997971982182426706592551291084007983387911006261442519635405457077292515085160744169867410973960652081452455371451222265819051559818441257438021073941183phi = (p - 1) * (q - 1)
# ed=k*phi+1
for e in range(100000):if gmpy2.gcd(e, phi) == 1:d = gmpy2.invert(e, phi)m = gmpy2.powmod(c, d, n)m = libnum.n2s(int(m))      #libnum.n2s 函数用于将整数转换为字节串if 'CTF' in str(m):print(m)break

 

根据以上,似乎没有发挥A的作用,没有直接参与RSA的解密过程

看了其他大神的wp,似乎常规解法是根据A来推测x,y的范围,解出x,y,根据q与iroot(n/(x*y),2)的值相接近.从而可以得出p,q的值.

import gmpy2count = 0
min_gap = 99999
max_gap = 0
p = 21679967315669523832823488086602270908640556452221643267343405142715107120582778258062778680925402382895255206278432676733248308929062714997512704088603667
for i in range(1000):pn = gmpy2.next_prime(p)count = count + pn - pmax_gap = max(max_gap, pn - p)min_gap = min(min_gap, pn - p)p = pnprint(count / 1000)
print(min_gap)
print(max_gap)

这是

155位(10进制)左右素数之间gap的大小,然后确定爆破的范围,

分析x,y的关系

      A转化为2进制后是2017位,而说明第一项只能为1,相比于第二项,第三项可以忽略,所以对A开316次根,得到y的估计值为83,考虑忽略项,实际y的值小于等于83

明显可以知道,x=2,y=83

import math
A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
for y in range(2, 85):for x in range(2, 100):try:a=(((y%x)**5)%(x%y))**2019+y**316+(y+1)//xif a-A <= 1000 and a- A>= -1000:print(x, y, a-A)except:pass

暴力破解了x,y,

后面就可以根据x,y推出p,q了

import gmpy2n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127def trybomb(t):print('when t is ' + str(t) + ' :')pv = gmpy2.isqrt(n // t) - 2000count = 1while count <= 1000:p = gmpy2.next_prime(pv)count += 1if n % p == 0:print('p = ', p)q = n // pbreakelse:pv = ptrybomb(166)
print('finish')

最后还是暴力破解出来e

[RoarCTF2019]babyRSA

题目看起来很复杂,但是你去将n分解一下,发现了刚好可以分解成三个素数,就变得很简单了

直接得到了flag

import libnum
c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
e=4097  #将0x1001转化为十进制数
r=1276519424397216455160791032620569392845781005616561979809403385593761615670426423039762716291920053306063214548359656555809123127361539475238435285654851
p=5057572094237208127867754008134739503717927865750318894982404287656747895573075881186030840558129423864679886646066477437020450654848839861455661385205433
q=13242175493583584108411324143773780862426183382017753129633978933213674770487765387985282956574197274056162861584407275172775868763712231230219112670015751
n=p*q*r
phi =(p-1)*(q-1)*(r-1)
d=libnum.invmod(e,phi)
m=pow(c,d,n)
print(libnum.n2s(m))

    维纳攻击:

            e的指数很大(理论上d<N**0.25作为攻击的实现)

实现Wiener攻击,这是一种针对具有较小解密指数d的RSA私钥的恢复

维纳攻击你要先知道以下几个知识点

        连分数:

      连分数的定义

连分数是一种特殊的分数表示法,其形式如下:

  

      其中,a0​是某个整数,而所有其他的数an​(n>0)都是正整数。连分数可以是有限的(即终止于某个an​),也可以是无限的(即不终止)。在数学中,任何一个有理数都可以表示为有限连分数,而任何一个无理数都可以表示为无限连分数。

      连分数在RSA中的应用

  1. 理论基础:连分数在RSA中的应用通常与Wiener攻击有关。Wiener攻击是一种利用RSA私钥的某些性质(如解密指数d较小)来恢复私钥的攻击方法。在这种攻击中,连分数被用来求解与私钥相关的同余方程。
  2. Wiener攻击:Wiener攻击基于一个数学定理,该定理允许我们根据给定的实数a和某个条件来求解整数p和q。在RSA的上下文中,这个实数a可能与私钥的某些属性相关,而p和q则是模数N的质因子。通过求解与a相关的连分数,攻击者可以逐步逼近p和q的值,并最终恢复私钥。
  3. 实际运用:在实际运用中,Wiener攻击需要满足一定的条件才能成功。例如,解密指数d必须小于某个阈值(这个阈值通常与模数N的大小有关)。此外,攻击者还需要能够获取到足够多的关于私钥的信息(如公钥e和模数N)。如果这些条件都得到满足,那么攻击者就可以使用连分数技术来恢复私钥。

        韦达定理

  韦达定理在二次方程 ax^2 + bx + c = 0

      根的和等于系数 b 的相反数除以系数 a,即 x_1 + x_2 = -b/a

       根的积等于常数项 c 除以系数 a,即 x_1 * x_2 = c/a

         来自己出一道题目

import libnum
import random
#生成随机的素数
p=libnum.generate_prime(512)
q=libnum.generate_prime(512)
m="flag{h3ll0-w0rld}"
#字符串转数字
m=libnum.s2n(m)
n=p*q
phi_n=(p-1)*(q-1)
#计算d
while True:nbits=1024d=random.getrandbits(nbits //4)if (libnum.gcd(d,phi_n)  ==1 and 36*pow(d,4) <n):break#计算出e
e=libnum.invmod(d,phi_n)
c=pow(m,e,n)
print("n=",n)
print("e=",e)
print("c=",c)

完整代码:

import gmpy2
import libnumdef continuedFra(x, y):# #此函数用于计算x/y的连分数表示。它使用辗转相除法(欧几里得算法)来逐步减少分数,直到分母y变为0。cf = []while y:cf.append(x // y)x, y = y, x % yreturn cf
def gradualFra(cf):# #这个函数接收一个连分数列表cf,并返回列表最后一个元素的渐近分数。它通过逆序遍历连分数列表,并使用特定的公式来计算分子和分母numerator = 0denominator = 1for x in cf[::-1]:# 这里的渐进分数分子分母要分开numerator, denominator = denominator, x * denominator + numeratorreturn numerator, denominator
def solve_pq(a, b, c):"""使用韦达定理解出pq,x^2−(p+q)∗x+pq=0:param a:x^2的系数:param b:x的系数:param c:pq:return:p,q"""par = gmpy2.isqrt(b * b - 4 * a * c)return (-b + par) // (2 * a), (-b - par) // (2 * a)
def getGradualFra(cf):"""计算列表所有的渐近分数:param cf: 连分数列表:return: 该列表所有的渐近分数"""gf = []for i in range(1, len(cf) + 1):gf.append(gradualFra(cf[:i]))return gfdef wienerAttack(e, n):#它首先计算公钥e相对于模数n的连分数表示,然后使用getGradualFra函数生成所有可能的渐近分数。对于每个渐近分数(d, k),它检查是否满足(e * d - 1) % k == 0。如果满足,它尝试使用(e * d - 1) // k作为phi(n)的近似值,并使用solve_pq函数尝试分解n以找到p和q。如果找到了有效的p和q,那么它会计算私钥d并返回cf = continuedFra(e, n)gf = getGradualFra(cf)for d, k in gf:if k == 0: continueif (e * d - 1) % k != 0:continuephi = (e * d - 1) // kp, q = solve_pq(1, n - phi + 1, n)if p * q == n:return d
n= 92524912824457455478469479834145192399327339422419976426014024967106017250525784362251809870851330233714073309745926853809722723590007799727853843200857232710763391103522003213039635901415434225633578811817814757637106456030410677721613532510535968977938933636723316561537077411888416685226759599589065857021
e= 54061685907559431614093395962586317025387379705558008571034720802508811703397874391457074838986258081858042924777974376782261530254408986545475988227306300250798769475295193119450403415247506835654081051816773486037227848499432844796357648121686484398862179371192675792796946629089692057399103015987899220553
c= 75914541873509926793052668657170821143574989686045126269695603145212114658529526002484357527707015025922193311737442791537506782543615634954764108902795246498210682486601649383685688201749284019581721635618585026491003845052815757860692633274121793700743169931534720441816541558209434925881957085594022520969d=wienerAttack(e, n)
m=pow(c, d, n)
print(libnum.n2s(m).decode())

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

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

相关文章

网卡配置基础知识

1、网络设置方式 首先科普下Virtual Box虚拟机的几种主流的网络设置方式&#xff0c;官方文档&#xff1a; 2解释 Host-only&#xff1a;仅主机模式 虚拟机和宿主机、虚拟机之间能互通&#xff0c;但是不能访问外网&#xff0c;虚拟机和宿主机同网段的其他主机不能互通这种…

JS实现时间段过滤搜索

你想要实现一个JavaScript函数&#xff0c;用于根据时间段过滤搜索结果吗&#xff1f;可以尝试以下的示例代码&#xff1a; // 假设这是你的数据 const data [{ id: 1, name: Alice, timestamp: 1622382000000 }, // 2021-05-30 12:00:00 UTC{ id: 2, name: Bob, timestamp: …

数据结构---栈队列

栈和队列是我们数据结构中经常使用的数据结构&#xff0c;所以现在来了解一下栈和队列。 栈 特点&#xff1a; 栈是一种特殊的线性表&#xff0c;其中进行数据插入和弹出的部分叫做栈顶&#xff0c;另一端叫做栈底。 只允许数据从栈顶压入&#xff0c;从栈顶弹出即先进后出的…

最佳实践:REST API 的 HTTP 请求参数

HTTP 请求中的请求参数解释 当客户端发起 HTTP 请求 时&#xff0c;它们可以在 URL 末尾添加请求参数&#xff08;也叫查询参数或 URL 参数&#xff09;来传递数据。这些参数以键值对的形式出现在 URL 中&#xff0c;方便浏览和操作。 请求参数示例 以下是一些带有请求参数的…

《mysql轻松学习·一》

SQL:结构化查询语言&#xff0c;用于访问和操作数据库&#xff0c;包括数据定义&#xff0c;数据操纵&#xff0c;数据查询&#xff0c;数据控制。 1、命令行 select version(); //查看当前版本 status; //查看用户信息&#xff0c;端口&#xff0c;版本号等信息 show databas…

C#中用 protobuf Struct 实现弱类型的json 序列化/反序列化

目标 在.net 大力支持使用 gRPC 的背景下&#xff0c;通过 jsontranscoding 可以实现 gRPC/WebAPI 一鱼两吃。有时候不想把json对象的所有属性都在 proto 中定义出来&#xff0c;比如设备对象&#xff0c;不同设备有不同的属性&#xff0c;要都强类型那C#里面的对象属性会很多&…

JS-Lodash工具库

文档&#xff1a;Lodash Documentation orderBy函数&#xff1a;根据条件进行排序 注&#xff1a;第一个是要排序的数组&#xff0c;第二个是根据什么字段进行排序&#xff0c;第三个是排序的方式&#xff08;desc倒序&#xff09; 安装方式&#xff1a;Lodash npm i lodash…

小型企业网络组网与配置仿真实验

实验要求如下: 我这里以学号46为例 一、IP 地址规划表 &#xff08;一&#xff09;主类网络 &#xff08;二&#xff09;子网划分 需要自己计算有效ip范围 在C类主网络192.168.46.0/24中&#xff0c;我们需要先了解这个网络的子网掩码为255.255.255.0&#xff0c;其二进制…

vue3 组件级权限控制

权限控制程度分为&#xff1a;1. 页面级 2. 组件级 3. 代码级 1. 页面级 这是大部分前端遇到的级别。依靠路由守卫&#xff0c;如果没有权限&#xff0c;就看不到菜单&#xff0c;就进不到页面。不会给页面带来侵入性。什么是侵入性&#xff0c;就是写页面组件的时候&#xf…

Flutter 中的 SliverFillViewport 小部件:全面指南

Flutter 中的 SliverFillViewport 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;SliverFillViewport 是一个用于 Custo…

『ZJUBCA MeetUP』 5月25日线下活动——Aptos 链的动态与应用

2024 求是创新 ZJUBCA Sponsored by the ALCOVE Community TIME&#xff1a;2024/05/25 ADD&#xff1a;浙江大学紫金港校区 --- Alcove 是 Aptos 公链与 Alibaba Cloud 共同打造的亚洲首个 Move 开发者社区&#xff0c;致力于支持开发者使用 Move 语言构建下一代 Web3 应用&am…

Linux的命令补全脚本

一 linux命令补全脚本 Linux的命令补全脚本是一个强大且高效的工具&#xff0c;它能够极大地提高用户在命令行界面的工作效率。这种脚本通过自动完成部分输入的命令或参数&#xff0c;帮助用户减少敲击键盘的次数并降低出错率。接下来将深入探讨其工作原理、安装方式以及如何自…

ffmpeg在特定时间点插入素材

如果要在视频的特定时间戳处插入图片&#xff0c;则可以使用以下命令&#xff1a; ffmpeg -i input.mp4 -i image.png -filter_complex “[0:v][1:v]overlay100&#x1f4af;enable‘between(t,5,10)’” -c:a copy output.mp4 这里使用了enable选项&#xff0c;指定了图片插入…

TPM之VMK密封

本篇文章主要介绍基于TPM的Bitlocker全盘加密时&#xff0c;VMK密钥的密封&#xff08;Seal&#xff09;流程&#xff0c;至于TPM、Bitlocker、密钥保护器、VMK密钥等这些东西是什么&#xff0c;这里不做解释&#xff0c;需要自己脑补一下&#xff08;╮(╯▽╰)╭&#xff09;…

【HarmonyOS】输入框焦点控制实现键盘显隐

【HarmonyOS】输入框焦点控制实现键盘显隐 问题背景&#xff1a; 鸿蒙中输入框控件&#xff0c;TextInput最常见的控制&#xff0c;即&#xff1a;针对输入框焦点控制&#xff0c;获取焦点&#xff0c;失去焦点。达到用户方便操作输入和退出输入。 因为输入框一定会伴随着键盘…

42.开发中对String.format()的使用之空位补齐

用于空位补齐 Int x1; //对于传入的数字做处理&#xff0c;如果传入的数字不足三位&#xff0c;则使用数字0自动补齐 String numString.format(“%”3”d”,x); System.out.println(“num”num);//输出结果为&#xff1a;001 也可以简写成&#xff1a; String num2String…

2024年大屏幕互动源码+动态背景图和配乐素材+搭建教程

2024年大屏幕互动源码动态背景图和配乐素材搭建教程 php宝塔搭建部署活动现场大屏幕互动系统php源码 运行环境&#xff1a;PHPMYSQL 下载源码地址&#xff1a;极速云

jenkins禁用所有job

背景 需要对jenkins做迁移&#xff0c;但是老的jenkins需要保留一段时间&#xff0c;先把老的jenkins所有job禁用掉 禁用多分支pipeline 找到Manage Jenkins>Script Console 输入下面的脚本 import hudson.model.*disableChildren(Hudson.instance.items)def disableChi…

数据库设计:实体关系图

一个良好的设计对于数据库系统至关重要&#xff0c;它可以减少数据冗余&#xff0c;确保数据的一致性和完整性&#xff0c;同时使得数据库易于维护和扩展。 实体关系图&#xff08;Entity-Relationship Diagram、ERD&#xff09;是一种用于数据库设计的结构图&#xff0c;它描…

Webrtc支持HEVC之FFMPEG支持HEVC编解码(一)

一、前言 Webrtc使用的FFMPEG(webrtc\src\third_party\ffmpeg)和官方的不太一样,使用GN编译,各个平台使用了不一样的配置文件 以Windows为例,Chrome浏览器也类似 二、修改配置文件 windows:chromium\config\Chrome\win\x64 其他平台: chromium\config\Chrome\YOUR_SYS…