CTF Crypto --- orz!

news2024/11/25 20:38:27

文章目录

      • 题目
      • 解题过程

题目

from Crypto.Util.number import *
from gmpy2 import *

flag = b'xxx'
t = len(flag)//3
part1 = bytes_to_long(flag[:t])
part2 = bytes_to_long(flag[t:2*t])
part3 = bytes_to_long(flag[2*t:])
q = getPrime(1024)
p = next_prime(q)
n = p * q

o = getPrime(11)
r = pow(part1, o, p)
z = pow(part2, o, p)

h1 = (13 * o + 14 * r + r * z + o * z ** 13) % p
h2 = (o ** 13 + r ** 12 + 3 * o * r + o * z * 233) % p
h3 = pow(part3,65537,n)

print(f'n = {n}')
print(f'h1 = {h1}')
print(f'h2 = {h2}')
print(f'h3 = {h3}')

# n = 10850335281775104384842309756387507121367947910896225110655535291748404338588972388693259827067445607230128971155491201985083085890729703137967791325100758142692285049056390126354246953310462082980059949946896088251642305978444680455930662301007461492978866538439458231120357274252592800042668860820459885960472737650446805378098344941597805604577797736381125259746781740429143953876454912647201590679786164678547559344304709889497251430904453036692562053570137262921657887410908992378188055660327282373869435308218926170927366572909858720457530661616332620263301130036238239402855045548920085800254012799063199438351
# h1 = 68971374440570454964336249870184699116849273092766598492393855724166755705038579719086135125490382149633066088736614770735555426661202444613481222308690955829177344713094803125405000495549811601138114210065623933916822257443366983845366477473811412048210602195672314631662681949260715610527325398006214477393
# h2 = 89557070262276493140173989636483552685176823962865601733383032051273942127575151309428084885522955047935745792156087951603894535351765100905696886714983834431355512680521411571740092935206188975497781396247799052916245218545834226095135276633422884113241438747017792108934964361391672183324214279475682695463
# h3 = 1311626365146856567785446974305480952394390450877042514912868019585929680223703697129400820765966547191027907141852232429577556122050933660875292235305985538892538821817570539411355339774474418018682334787217004485252794403892893871864009361554731318803763221581009731474777526380398647174787569510518293833348676730943915073911916070766302422834190969513630361764429111809259665372926096307389623440860840605142551951919723403665762066543095024186705959708920942727754417048332722263643582752118944418881587666520088786189326167958303315156763867706697503512512849397447463575294489956813935149823414834222869976238

解题过程

根据题目代码p = next_prime(q)可知,pq相邻,直接对n开方然后取下一个素数,直到被n整除为止,此时的p为所求。之后简单RSA解密即可求得flag3

#sage
n = 10850335281775104384842309756387507121367947910896225110655535291748404338588972388693259827067445607230128971155491201985083085890729703137967791325100758142692285049056390126354246953310462082980059949946896088251642305978444680455930662301007461492978866538439458231120357274252592800042668860820459885960472737650446805378098344941597805604577797736381125259746781740429143953876454912647201590679786164678547559344304709889497251430904453036692562053570137262921657887410908992378188055660327282373869435308218926170927366572909858720457530661616332620263301130036238239402855045548920085800254012799063199438351
p_near = gmpy2.iroot(n,2)[0]
while n%p_near!=0:
    p_near = gmpy2.next_prime(p_near)
p = p_near
q = n//p
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m3 = pow(h3,d,n)
flag3 = long_to_bytes(int(m3))

接下来,我们已知条件
h 1 = 13 ∗ o + 14 ∗ r + r ∗ z + o ∗ z 13   m o d   p h_1 = 13*o+14*r+r*z+o*z^{13} \space mod \space p h1=13o+14r+rz+oz13 mod p
h 2 = o 13 + r 12 + 3 ∗ o ∗ r + 233 ∗ z ∗ o   m o d   p h_2 = o^{13}+r^{12}+3*o*r+233*z*o \space mod \space p h2=o13+r12+3or+233zo mod p

h 2 h_2 h2变换,可得
⇒ 233 ∗ o ∗ z = ( h 2 − o 13 − r 12 − 3 ∗ o ∗ r )   m o d   p \Rightarrow 233*o*z = (h_2-o^{13}-r^{12}-3*o*r) \space mod \space p 233oz=(h2o13r123or) mod p
⇒ z = ( h 2 − o 13 − r 12 − 3 ∗ o ∗ r ) ∗ ( 233 ∗ o ) − 1   m o d   p \Rightarrow z = (h_2-o^{13}-r^{12}-3*o*r)*(233*o)^{-1} \space mod \space p z=(h2o13r123or)(233o)1 mod p

o已知时,z是一个在模p下关于r的等式(等下会用到)

那么,我们利用 h 1 h_1 h1构建一个在模p上面的多项式环,设r为变量,方程如下
f = 13 ∗ o + 14 ∗ r + r ∗ z + o ∗ z 13 − h 1 f = 13*o+14*r+r*z+o*z^{13} -h_1 f=13o+14r+rz+oz13h1
方程中的z其实是一个关于r的等式,也就是说这个方程只有一个变量r
由于o = getPrime(11),它是一个11bit的素数,其范围在 [ 2 10 , 2 11 − 1 ] [2^{10},2^{11}-1] [210,2111],可以使用爆破的方法来找到合适的o

爆破素数o,然后计算出方程的解,也就是r。遍历每一个方程的解(解出的方程可能不止一个解),然后普通RSA解密,判断其明文是否包含flag{字符串,包含的话,此时的o即为所求。

正向爆破代码:

#sage
#find o,r,z
Flag = False
for o in trange(2**10+1,2**11,1):
    if is_prime(o):
        P.<r> = PolynomialRing(GF(p))
        z = inverse_mod(o*233,p)*(h2 - o^13 - r^12 -3*o*r)
        f = (13 * o + 14 * r + r * z + o * z ** 13) - h1
        result = f.roots()
        if result!=[]:
            for r in result:
                try:
                    d1 = gmpy2.invert(o,p-1)
                    find_m = pow(int(r[0]),d1,p)
                    find_flag = long_to_bytes(int(find_m))
                    if b'flag{' in find_flag:
                        print(f'o = {o}')
                        Flag=True
                        break
                except:
                    pass
    if Flag==True:
        break

爆破时间约为40分钟,🐏慢,慢得流脓!
在这里插入图片描述

逆向爆破代码:

#sage
#find o,r,z
Flag = False
for o in trange(2**11-1,2**10,-1):
    if is_prime(o):
        P.<r> = PolynomialRing(GF(p))
        z = inverse_mod(o*233,p)*(h2 - o^13 - r^12 -3*o*r)
        f = (13 * o + 14 * r + r * z + o * z ** 13) - h1
        result = f.roots()
        if result!=[]:
            for r in result:
                try:
                    d1 = gmpy2.invert(o,p-1)
                    find_m = pow(int(r[0]),d1,p)
                    find_flag = long_to_bytes(int(find_m))
                    if b'flag{' in find_flag:
                        print(f'o = {o}')
                        Flag=True
                        break
                except:
                    pass
    if Flag==True:
        break

逆向爆破,因为o=1949靠近 2 11 − 1 2^{11}-1 2111,所以花费时间比较短,大概5分钟左右。
PS:至于为什么要写逆向爆破代码,主要是因为从头爆破起太慢了。而笔者一个很懒的人,懒得等。
在这里插入图片描述

最后将o=1949带入,求解出r,再把r带入解出z,分别RSA解密即可得到flag1flag2,然后把flag1、flag2、flag3拼接起来即可得到最终的flag

#sage
from  Crypto.Util.number import *
import gmpy2
from tqdm import *
n = 10850335281775104384842309756387507121367947910896225110655535291748404338588972388693259827067445607230128971155491201985083085890729703137967791325100758142692285049056390126354246953310462082980059949946896088251642305978444680455930662301007461492978866538439458231120357274252592800042668860820459885960472737650446805378098344941597805604577797736381125259746781740429143953876454912647201590679786164678547559344304709889497251430904453036692562053570137262921657887410908992378188055660327282373869435308218926170927366572909858720457530661616332620263301130036238239402855045548920085800254012799063199438351
h1 = 68971374440570454964336249870184699116849273092766598492393855724166755705038579719086135125490382149633066088736614770735555426661202444613481222308690955829177344713094803125405000495549811601138114210065623933916822257443366983845366477473811412048210602195672314631662681949260715610527325398006214477393
h2 = 89557070262276493140173989636483552685176823962865601733383032051273942127575151309428084885522955047935745792156087951603894535351765100905696886714983834431355512680521411571740092935206188975497781396247799052916245218545834226095135276633422884113241438747017792108934964361391672183324214279475682695463
h3 = 1311626365146856567785446974305480952394390450877042514912868019585929680223703697129400820765966547191027907141852232429577556122050933660875292235305985538892538821817570539411355339774474418018682334787217004485252794403892893871864009361554731318803763221581009731474777526380398647174787569510518293833348676730943915073911916070766302422834190969513630361764429111809259665372926096307389623440860840605142551951919723403665762066543095024186705959708920942727754417048332722263643582752118944418881587666520088786189326167958303315156763867706697503512512849397447463575294489956813935149823414834222869976238
e = 65537

#get flag3 and p
p_near = gmpy2.iroot(n,2)[0]
while n%p_near!=0:
    p_near = gmpy2.next_prime(p_near)
p = p_near
q = n//p
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m3 = pow(h3,d,n)
flag3 = long_to_bytes(int(m3))

o = 1949
P.<r> = PolynomialRing(GF(p))
z = inverse_mod(o*233,p)*(h2 - o^13 - r^12 -3*o*r)
f = (13 * o + 14 * r + r * z + o * z ** 13) - h1
r = f.roots()[0][0]
z = inverse_mod(o*233,p)*(h2 - o^13 - r^12 -3*o*r)

d = gmpy2.invert(o,p-1)
#get flag1
m = pow(r,d,p)
flag1 = long_to_bytes(int(m))
#get flag2
m2 = pow(z,d,p)
flag2 = long_to_bytes(int(m2))

print(flag1+flag2+flag3)

flag:

flag{c8f3ad650e7075488801e0e4cb91a4ba}

【许多今日之心心念念,无非是来年之付诸一笑。】

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

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

相关文章

面试必备,29个Java面试必考点、1000多道Java面试题

马上金九银十招聘旺季就到了&#xff0c;不知道大家是否准备好了&#xff0c;面对金九银十的招聘旺季&#xff0c;如果没有精心准备那笔者认为那是对自己不负责任&#xff1b;就我们Java程序员来说&#xff0c;多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础…

文献下载神器:文献党下载器使用方法

文献党下载器是一款文献资源整合平台&#xff0c;把知网、万方、维普、超星/读秀、Web of Science、Elsevier&#xff08;ScienceDirect&#xff09;、Wiley 、SpringerLink、EI&#xff08;工程索引&#xff09;、IEEE&#xff08;电气电子工程师学会&#xff09;、Taylor &am…

ESP32-C3系列模组简介

ESP32-C3是一款安全稳定、低功耗、低成本的物联网芯片&#xff0c;搭载RISC-V 32位单核处理器&#xff0c;为物联网产品提供行业领先的射频性能、完善的安全机制和丰富的内存资源。 嵌入式智能终端、无线WIFI技术以及Internet的广泛应用必将使家居控制变得更加自动化、智能化和…

基础软件加速自主创新,openGauss成就业务“新箭头”

不久前&#xff0c;想必业界都注意到了MetaERP横空出世的消息。作为企业经营的核心系统&#xff0c;MetaERP突破外部封锁&#xff0c;实现完全自研替代&#xff0c;是华为有史以来牵涉面较广、复杂性较高的项目。这其实是国产基础软件迅速崛起的一个缩影。 基础软件产业是关系…

element-plus vue 错误汇总

input 无法输入0.01 element ui input 无法输入0.01 一输出0.0就报错&#xff0c;是因为写成了v-model.number&#xff0c;改成v-model即可。 <el-input v-model.number"formData.reduceMoney"class"input200"type"number"focus"discou…

C#开发的OpenRA游戏之建造物品的窗口1

C#开发的OpenRA游戏之建造物品的窗口1 前面已经分析了基地工程车的创建和移动,当玩家把基地工程车移动到合适的位置,就会进行部署基地,也即是选择一个离矿场比较近的位置,因为这样做可以提高采矿的速度,减少采矿车的运输时间。 接着下来,虽然基地是建立了,但是还需要创…

HybridCLR 最佳实践,老项目集成热更(战棋项目)

文本介绍了老项目使用HybridCLR 集成热更的过程 从项目结构调整&#xff0c;代码调整&#xff0c;打包&#xff0c;热更测试&#xff0c;跑完HybridCLR所有流程 先看效果&#xff08;安卓&#xff09; 源码及资料领取方式私信&#xff1a;领取资料&#xff1a;HybridCLR战棋热更…

2023亚马逊云科技中国峰会引领无服务器架构新潮流:Serverlesspresso Workshop

序言 在今年3月&#xff0c;我有幸接触了一个项目&#xff0c;也因此结识了 亚马逊云科技无服务器架构 Serverless。在陆续了解 Amazon 产品的过程中&#xff0c;我逐渐发现它所带给我的惊喜远远超出了最初的预期。 今天&#xff0c;想向大家介绍一个名为 Serverlesspresso Wor…

京东数据分析:2023年Q1京东奶粉品牌销量排行榜

近几年我国新生人口数量不断下降。尽管国家大力推进多胎政策&#xff0c;但奶粉的市场需求量依然有明显下滑&#xff0c;导致国内奶粉行业的发展低迷&#xff0c;今年Q1依然没有回弹的迹象。 根据鲸参谋数据显示&#xff0c;今年Q1奶粉在京东平台销量2000万件&#xff0c;同比下…

自学网络安全(白帽黑客)必看!OWASP十大漏洞解析!

在学习网络安全之前&#xff0c;需要总体了解安全趋势和常见的Web漏洞&#xff0c;在这里我首推了解OWASP&#xff0c;因为它代表着业内Web安全漏洞的趋势&#xff1b; 目录 一、OWASP简介 OWASP Top 10: 2013版至2017版改变了哪些内容 二、OWASP Top 10 A1:注入漏洞 A2:…

【C语言】整,浮点型数据存储,大小端。细节拉满!!

目录 一. 整型 1. C语言内置整型家族 类型的意义&#xff1a; 2.整型在内存如何存储的呢&#xff1f; 3. 原码&#xff0c;反码&#xff0c; 补码 原码 反码 补码 4. 当 整型遇上unsigned 会发生什么呢&#xff1f; 1. unsigned 与 signed 解析 2. printf 输出 有无…

Kafka学习---1、Kafka 概述、Kafka快速入门

1、Kafka概述 1.1 定义 1、Kafka传统定义&#xff1a;Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue)&#xff0c;主要是应用于大数据实时处理领域。 2、发布/订阅&#xff1a;消息的发布者不会将信息直接发送给特定的订阅者&#xff0c;而是将发布的信息分…

【Linux 学习 ①】- Linux 环境搭建

目录 一、GouMai 云服务器 二、使用 Xshell 远程登录服务器 三、编写一个 C 程序 四、多用户共享同一个服务器 一、GouMai 云服务器 我们以腾讯云为例&#xff08;购买其他厂商的云服务器&#xff0c;例如&#xff1a;华为云、阿里云&#xff0c;其操作也是类似的&#…

Java集成开发环选择与Eclipse初始常用配置

开发工具的选择 Eclipse 、Idea是最常用的两个Java开发工具&#xff0c;虽然Idea相比前者更易用&#xff0c;但由于其价格昂贵&#xff0c;且由于整体市场经济环境的猥琐&#xff0c;导致各公司开始打击盗版软件&#xff0c;以此来增加收入。 基于以上背景&#xff0c;还是建议…

Kamrada operator:新一代的 Karmada 管理方式

Karmada operator 是 Karmada 社区推出的新组件&#xff0c;它为用户提供了全新的 Karmada 生命周期管理的方式。用户可以在全局集群之上集中式来管理多个 Karmada&#xff0c;通过 CR 资源来控制 Karmada 的创建、升级和卸载。为用户运维和管理 Karmada 提供了极大的便捷。本文…

12个经典性能测试人员面试题

1、性能测试包含了哪些软件测试&#xff08;至少举出3种&#xff09;&#xff1f; 参考答案&#xff1a;负载测试;压力测试;容量测试;负载测试&#xff08;Load Testing&#xff09;&#xff1a;负载测试是一种主要为了测试软件系统是否达到需求文档设计的目标&#xff0c;譬如…

如何在 Jupyter Notebook 用一行代码启动 Milvus?

随着各种大语言模型&#xff08;LLM&#xff09;的涌现和 AI 技术变得越来越普遍&#xff0c;大家对于向量数据库的需求也变得越来越多。作为大模型的记忆体&#xff0c;向量数据库不仅可以帮助解决 LLM 面临的最大问题——缺乏特定领域知识和最新数据&#xff0c;还可以赋能相…

【数据结构】查找(一)

因为时间关系&#xff08;现阶段来不及&#xff09;&#xff0c;先不学红黑树和B树&#xff0c;所以这是查找&#xff08;一&#xff09;。 先写一下二分查找&#xff0c;数据结构数上叫的“折半查找”。 二分查找 左闭右闭区间 左闭右开区间 下面依旧是对王道书上选择题的一…

突破竞争壁垒:独立站如何实现有效的品牌差异化?

在当今竞争激烈的电商市场中&#xff0c;独立站已经成为了越来越多品牌的选择。然而&#xff0c;要想在这个竞争激烈的环境中脱颖而出&#xff0c;建立起独特的品牌差异化是至关重要的。品牌差异化是一种战略方法&#xff0c;旨在突出品牌在市场上的独特性和独有价值&#xff0…

Java阶段四Day02

Java阶段四Day02 文章目录 Java阶段四Day02VueCli嵌套路由总结项目开发开发流程关于项目项目分析数据库的设计规范(基于阿里巴巴Java开发手册)数据库表设计创建项目关于依赖项关于<build>报错 VueCli嵌套路由 由于Vue Cli工程是单页面的&#xff0c;为了保证能显示各式各…