buuctf的RSA(五)

[RoarCTF2019]RSA

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

先来分解n

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


import gmpy2
import libnum
from Crypto.Util.number import long_to_bytes

A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128

print(len(str(A)))

q = 842868045681390934539739959201847552284980179958879667933078453950968566151662147267006293571765463137270594151138695778986165111380428806545593588078365331313084230014618714412959584843421586674162688321942889369912392031882620994944241987153078156389470370195514285850736541078623854327959382156753458569
p = 139916095583110895133596833227506693679306709873174024876891023355860781981175916446323044732913066880786918629089023499311703408489151181886568535621008644997971982182426706592551291084007983387911006261442519635405457077292515085160744169867410973960652081452455371451222265819051559818441257438021073941183

phi = (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 gmpy2

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

print(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)//x
            if a-A <= 1000 and a- A>= -1000:
                print(x, y, a-A)
        except:
            pass

暴力破解了x,y,

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

import gmpy2

n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127


def trybomb(t):
    print('when t is ' + str(t) + ' :')
    pv = gmpy2.isqrt(n // t) - 2000
    count = 1
    while count <= 1000:
        p = gmpy2.next_prime(pv)
        count += 1
        if n % p == 0:
            print('p = ', p)
            q = n // p
            break
        else:
            pv = p


trybomb(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=1024
    d=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 libnum

def continuedFra(x, y):
   # #此函数用于计算x/y的连分数表示。它使用辗转相除法(欧几里得算法)来逐步减少分数,直到分母y变为0。
  
    cf = []
    while y:
        cf.append(x // y)
        x, y = y, x % y
    return cf
def gradualFra(cf):
  # #这个函数接收一个连分数列表cf,并返回列表最后一个元素的渐近分数。它通过逆序遍历连分数列表,并使用特定的公式来计算分子和分母
    numerator = 0
    denominator = 1
    for x in cf[::-1]:
        # 这里的渐进分数分子分母要分开
        numerator, denominator = denominator, x * denominator + numerator
    return 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 gf


def 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: continue
        if (e * d - 1) % k != 0:
            continue
        phi = (e * d - 1) // k
        p, q = solve_pq(1, n - phi + 1, n)
        if p * q == n:
            return d
n= 92524912824457455478469479834145192399327339422419976426014024967106017250525784362251809870851330233714073309745926853809722723590007799727853843200857232710763391103522003213039635901415434225633578811817814757637106456030410677721613532510535968977938933636723316561537077411888416685226759599589065857021
e= 54061685907559431614093395962586317025387379705558008571034720802508811703397874391457074838986258081858042924777974376782261530254408986545475988227306300250798769475295193119450403415247506835654081051816773486037227848499432844796357648121686484398862179371192675792796946629089692057399103015987899220553
c= 75914541873509926793052668657170821143574989686045126269695603145212114658529526002484357527707015025922193311737442791537506782543615634954764108902795246498210682486601649383685688201749284019581721635618585026491003845052815757860692633274121793700743169931534720441816541558209434925881957085594022520969


d=wienerAttack(e, n)
m=pow(c, d, n)
print(libnum.n2s(m).decode())

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 项目中使用 JSP

文章目录 Spring Boot 项目中使用 JSP项目结构引入依赖包编写页面和后台运行方式一&#xff1a;Maven 命令运行方式二&#xff1a;在 IDEA 中运行方式三&#xff1a;打 war 包部署运行 Spring Boot 项目中使用 JSP 在 Spring Boot 项目中不是不可以使用 JSP 。想在 Spring Boo…

科普健康短视频:成都鼎茂宏升文化传媒公司

科普健康短视频&#xff1a;引领健康知识新潮流 在数字化时代的浪潮中&#xff0c;短视频以其短小精悍、直观易懂的特点&#xff0c;迅速成为大众获取信息的重要渠道。其中&#xff0c;科普健康短视频更是凭借其科学、权威、实用的内容&#xff0c;吸引了大量关注健康的观众。…

linux下使用cmake-gui编译WXQT

一.编译环境 操作系统&#xff1a;Ubuntu 22.04.3 LTS wxWidgets源码&#xff1a;wxWidgets-3.1.5 编译工具&#xff1a;CMake-gui qt版本&#xff1a;5.13.2 二.编译步骤 1.将源码解压。 2.打开CMake-gui&#xff0c;并设置好源码目录和构建目录 3.点击configure 会弹出…

Jenkins常用插件与应用详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jenkins是一个平台我们通过安装插件来解决我们想要完成的任务 1、Jenkins常用插件 Allure&#…

springboot+vue 社区养老服务系统

Springbootvue社区居家养老服务系统&#xff0c;数据库mysql&#xff0c;mybatis框架&#xff0c;有可视化页面。 功能&#xff1a; 用户管理 养老服务管理 护理人员管理 服务类型管理 健康状况管理 社区管理 服务区管理 娱乐资讯管理 咨询分类管理 反馈建议 系统简历管理 轮播…

Linux - 磁盘管理1

1.磁盘的分区 1.1 磁盘的类型&#xff08;标签&#xff09; MBR&#xff1a; ① 最大支持2T以内的硬盘 ② 有主分区p 拓展分区e 逻辑分区l之分 > 主分区编号1-4&#xff0c;主分区可以格式化使用 拓展分区编号1-4&#xff0c;拓展分区不能格式化 拓展分区最多能有1个&…

Vue2 + Element UI 封装 Table 递归多层级列表头动态

1、在 components 中创建 HeaderTable 文件夹&#xff0c;在创建 ColumnItem.vue 和 index.vue。 如下&#xff1a; 2、index.vue 代码内容&#xff0c;如下&#xff1a; <template><div><el-table:data"dataTableData"style"width: 100%"…

TXT文档拆分、合并、添加内容,修改内容、删除内容——首助编辑高手软件一招解决

下面这个TXT文档里面是一篇长篇小说&#xff0c;大家都知道一般小说文字内容是比较大的一个文件呢&#xff0c;想要拆分&#xff0c;拆分肯定是有方法呢&#xff0c;比如比较重统的方法手动一章一章复制出来&#xff0c;粘贴到另一个文档里面去粘贴&#xff0c;手动操作是不是很…

从人工向智能化转变,企业级指标管理平台建设实战

随着大数据技术和人工智能的发展&#xff0c;企业逐渐意识到构建一个集中化的指标管理平台的必要性。这样的平台旨在解决几个核心问题&#xff1a;首先&#xff0c;确保所有部门都能通过统一的入口提交指标需求&#xff0c;实现需求的透明化管理&#xff1b;其次&#xff0c;建…

计算机视觉与模式识别实验1-1 图像的直方图平衡

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;1.读入图像‘rice.png’&#xff0c;在一个窗口中显示灰度级n64&#xff0c;128和256的图像直方图。2.调解图像灰度范围&#xff0c;观察变换后的图像及其直方图的变化。3.分别对图像‘pout.tif’和‘ti…

神奇的现象——body背景

当我们设置 body 背景时&#xff0c;有一个神奇的现象。 当 HTML 元素有背景时 html {background-color: lightblue }body {width: 100px;height: 100px;border: 3px dashed #f66e6e;background-color: thistle; } 显示如下&#xff1a; 注意&#xff1a; 由于 body 设置了…

CraftCMS ConditionsController.php 代码执行漏洞(CVE-2023-41892)

0x01 产品简介 Craft CMS是一个开源的内容管理系统,它专注于用户友好的内容创建过程,逻辑清晰明了,是一个高度自由,高度自定义设计的平台吗,可以用来创建个人或企业网站也可以搭建企业级电子商务系统。 0x02 漏洞概述 Craft CMS在4.4.15版本之前存在远程代码执行漏洞,…

安防综合管理系统EasyCVR平台GA/T1400视图库:基于XML的消息体格式

GA/T 1400标准的应用范围广泛&#xff0c;涵盖了公安系统的视频图像信息应用系统&#xff0c;如警务综合平台、治安防控系统、交通管理系统等。在视频监控系统中&#xff0c;GA/T 1400公安视图库的对接是实现视频图像信息传输、处理和管理的重要环节。 以视频汇聚EasyCVR视频监…

Linux|虚拟机|Windows 11 家庭版的Hyper虚拟机服务开启

前言&#xff1a; Windows11的版本是比较多的&#xff0c;但有的时候笔记本预装的可能是家庭版&#xff0c;而家庭版的Windows通常是不支持虚拟机的&#xff0c;也就是说Hyper服务根本就看不到 Windows的程序和功能大体如下&#xff1a; &#x1f197;&#xff0c;那么如何开…

运维怎么转行网络安全?

经常有人问我&#xff1a;干网工、干运维多年遇瓶颈&#xff0c;想学点新技术给自己涨涨“身价”&#xff0c;应该怎么选择&#xff1f; 聪明人早已经用脚投票&#xff1a;近年来&#xff0c;越来越多运维的朋友寻找新的职业发展机会&#xff0c;将目光聚焦到了网络安全产业。…

反激电源压敏电阻设计

压敏电阻的作用&#xff1a;浪涌防护。在电源出现浪涌冲击时&#xff0c;保护核心器件不受到损坏。其实类似于稳压二极管 瞬间的瞬态波 1 压敏电压 单位是&#xff0c;虽然压敏电阻可以吸收很大的浪涌能量&#xff0c;但是不能承受mA以上的持续电流。压敏电压计算公式 2 通流容…

免费的VMware ?就是它了!【送源码】

在 Docker 没有出来之前&#xff0c;很多项目的的部署方案是使用虚拟机&#xff0c;在一台服务器上创建好几个虚机出来&#xff0c;配置一下网络&#xff0c;就可以把一台服务器当做多个服务器用了。 而作为开发者来说&#xff0c;我们经常碰到需要使用不同操作系统的需求&…

HTML+CSS 响应式侧边栏菜单

效果演示 实现了一个响应式的侧边栏菜单,当用户点击菜单按钮时,菜单会从左侧滑出,同时页面内容会向右移动,展示菜单选项。菜单选项包括一个头像和用户名,以及其他的菜单项,当用户将鼠标悬停在菜单项上时,菜单项会高亮显示。这段代码使用了CSS的flex布局和过渡效果,以及…

【Linux】线程ID

大致草稿—————————— 思维导图 学习目标 一、线程ID的理解 1.1 引出对tid的理解 我们先来创建一个线程复习一下线程的函数&#xff1a; pthread_t tid; // 创建一个线程 pthread_create(&tid, nullptr, threadrun, (void*)"thread-1"); // 打印出…

Nacos-SpringBoot-配置中心

Nacos配置中心 前情回顾 上一章呢 了解并且学习了Nacos服务注册与发现 在一系列破防中走了出来Nacos服务注册完成https://blog.csdn.net/m0_68711597/article/details/139265244?spm1001.2014.3001.5502 本以为接下来会一帆风顺 一马平川 没想刚出坑 又入坑 Nacos的配置…