宁波市第八届网络安全大赛 – Crypto – WriteUp

Three-prime RSA

task

import gmpy2
from Crypto.Util.number import *from secret import flagp = getPrime(512)
q = getPrime(512)
r = getPrime(512)
n = p * q * r
random_num = getPrime(28)
D = ((p + q + r) * random_num) % n
e = 65537
d = gmpy2.invert(e,(p-1)*(q-1)*(r-1))
m = bytes_to_long(flag)
c = pow(m,e,n)
m = long_to_bytes(pow(c,d,n))
print(f'n = {n}')
print(f"c = {c}")
print(f'e = {e}')
print(f'D = {D}')
print(f'r_cubed = {r**3}')
#n = 1797464363937803574178366635456301143459899987065195402238965688630854838574693129181564969286593529451541315147307698518248164419022745845149367101229289853511043305315113437055463741220310201972952525360384401292742908307617104187282410207011086837143526628825853819176582961596474273863005403315519262514987973727415369569624782351302222624317374956732149792365793683939133163240811987601690584296532495636077337007058250072691770687934895196018165482285074087
#c = 334735157214244327583157709091138850291255337497549444727968382625552814752420162774889355435597239850801444255501536062808665271447071394852127129645007823666189408974242614895090473463544656321304260276646862158621490436794225048527190465633048027777929676430778187663379548454777508032938086766087680923109105263450337252432956611495124284902807201570660674571972801630769083508865730870372239801449723990206104741555109361529711228109643651552666016767418334
#e = 65537
#D = 9293355851986591081591521098987501845963630839756264676294309115767555607188666083544593308349243222711109037704690481694680479223233813272567476445999227440933917
#r_cubed = 1733587395810445026263077101568701832386760527292029091732688691632302263295044364907002644024851393182111273947443724875261726589148427101911382909265190107241975414590360694235677890202731336061400362438326929279259311961356096293232720988325040307146370196619971302229486629240899410846744560517421971004381582157573816044985536221126650590038003165043945929284756476920639015271502102636205225479117479735091470661892665348612065863317686928100311559126824531

exp

from Crypto.Util.number import *
from gmpy2 import irootn = 1797464363937803574178366635456301143459899987065195402238965688630854838574693129181564969286593529451541315147307698518248164419022745845149367101229289853511043305315113437055463741220310201972952525360384401292742908307617104187282410207011086837143526628825853819176582961596474273863005403315519262514987973727415369569624782351302222624317374956732149792365793683939133163240811987601690584296532495636077337007058250072691770687934895196018165482285074087
c = 334735157214244327583157709091138850291255337497549444727968382625552814752420162774889355435597239850801444255501536062808665271447071394852127129645007823666189408974242614895090473463544656321304260276646862158621490436794225048527190465633048027777929676430778187663379548454777508032938086766087680923109105263450337252432956611495124284902807201570660674571972801630769083508865730870372239801449723990206104741555109361529711228109643651552666016767418334
e = 65537
D = 9293355851986591081591521098987501845963630839756264676294309115767555607188666083544593308349243222711109037704690481694680479223233813272567476445999227440933917
r_cubed = 1733587395810445026263077101568701832386760527292029091732688691632302263295044364907002644024851393182111273947443724875261726589148427101911382909265190107241975414590360694235677890202731336061400362438326929279259311961356096293232720988325040307146370196619971302229486629240899410846744560517421971004381582157573816044985536221126650590038003165043945929284756476920639015271502102636205225479117479735091470661892665348612065863317686928100311559126824531
r = iroot(r_cubed, 3)[0]
phi = r - 1
d = inverse(e, phi)
print(long_to_bytes(pow(c, d, r)))
# b'DASCTF{5521a971-9bed-11ef-bfda-14ac6024b6a8}'

earsa_6

task

from sage.all import *
# from secret import flag
flag = b'flag{this_is_a_test_flag_lalala~~~}'
from Crypto.Util.number import *p = next_prime(ZZ.random_element(2 ** 512))
q = next_prime(ZZ.random_element(2 ** 512))m = bytes_to_long(flag) 
n = p * q
print(f"p = {p}")
print(f"q = {q}")
phi_n = (p+1)*(q+1)e = ZZ.random_element(phi_n)
while gcd(e, phi_n) != 1:e = ZZ.random_element(phi_n)d = inverse_mod(e, phi_n)c = pow(m, e, n) # c = (mod(m ** 2, n) * power_mod(e, 2, n)) % nprint(f"n = {n}")
print(f"e = {e}")
print(f"c = {c}")
# "n = 103290940605767097772547367608381852550255311740089066062370678669736584831966972390296508499564302740251039905216525828381026059914694968711341442279592794179645755109637276941753470671672492643863307674183032056063497595618158607559032052302672569850017317721983409928424751468273419269585837187792579680441"
# "e = 4153390199995099394559502199356876987641001700181798065618463687883377896662802735692294514592974848815256220220567520414785101204978084883084168277609953983317089255372031928914225544973810429741972241310760306291217083076283386527880407979441234845945200062237779009000326020732264366320464844100039711500073849140628815801055506193561725597087896534906132971553150940778821878782222775892376719019037312704365897736892636528690951714686191932520762021674718730306167017168655476030445903413293206451445350127989832224321862119769332948547212450481322973363484001293075189230923276019258476580885163774258459928467"
# "c = 100933162705070380579705358896231615705264597351634019368382319632347917048149032133717183415739431564428093428992978229723659108455837366449426780119900838833128284699424510443364272415543344735540591444863458191423494866766098524960586274161507718151409519858841560317649453200969001613445259145496747256869"

analysis

  • 根据题目描述信息搜集到相关的题型,先前也没有见过,但是有类似的题型以及攻击策略。
  • 再利用现有的attack分解n之后,我们进行下一步的求解。这里前面按照原有的题目,发现这里的e并非题目脚本生成的。这里和赛事方进行了很长时间的沟通,按照原有的思路,我会进行有限域内开放求解m但是这里并没有解,知道比赛题目难度降低,分解n之后直接RSA解密即可。

exp

from Crypto.Util.number import *
from sage.all import *def attack(N, e):"""Recovers the prime factors of a modulus and the private exponent if two prime factors share most significant bits:param N: the modulus:param e: the public exponent:return: a tuple containing the prime factors and the private exponent, or None if the private exponent was not found"""PR = PolynomialRing(ZZ, 'x')x = PR.gen()convergents = continued_fraction(ZZ(e) / ZZ((N - 1) ** 2)).convergents()for c in convergents:k = c.numerator()d = c.denominator()try:f = x ** 2 - x * (N ** 2 + 1 - int((e * d - 1) / k)) + N ** 2if f.discriminant() > 0:root = f.roots()p2 = root[0][0]; q2 = root[1][0]if is_square(p2) and is_square(q2):p = isqrt(p2); q = isqrt(q2)if p * q == N:return p, q, dexcept:continuereturn Nonen = 103290940605767097772547367608381852550255311740089066062370678669736584831966972390296508499564302740251039905216525828381026059914694968711341442279592794179645755109637276941753470671672492643863307674183032056063497595618158607559032052302672569850017317721983409928424751468273419269585837187792579680441
e = 4153390199995099394559502199356876987641001700181798065618463687883377896662802735692294514592974848815256220220567520414785101204978084883084168277609953983317089255372031928914225544973810429741972241310760306291217083076283386527880407979441234845945200062237779009000326020732264366320464844100039711500073849140628815801055506193561725597087896534906132971553150940778821878782222775892376719019037312704365897736892636528690951714686191932520762021674718730306167017168655476030445903413293206451445350127989832224321862119769332948547212450481322973363484001293075189230923276019258476580885163774258459928467
c = 100933162705070380579705358896231615705264597351634019368382319632347917048149032133717183415739431564428093428992978229723659108455837366449426780119900838833128284699424510443364272415543344735540591444863458191423494866766098524960586274161507718151409519858841560317649453200969001613445259145496747256869# print(attack(n, e))
p, q, d = attack(n, e)
assert n % p == 0
flag = long_to_bytes(int(pow(c, d, n)))
print(flag)

写在最后

  • 第一题不知道是出题人故意而为之还是没有考虑到flag过短导致可以直接开方r下转素数进行求解。

  • 第二题未修正之前有点看不懂加密,修正的时候说是为了降低难度,后续针对于赛事方的数据进行了测试,感觉很…

    from sage.all import *
    from Crypto.Util.number import *# 提交正确的flag
    flag = b'DASCTF{5e1eddfb-dda2-11ed-8d28-ac675d417bad}'
    m = bytes_to_long(flag)# 题目附件给出的n
    n = 103290940605767097772547367608381852550255311740089066062370678669736584831966972390296508499564302740251039905216525828381026059914694968711341442279592794179645755109637276941753470671672492643863307674183032056063497595618158607559032052302672569850017317721983409928424751468273419269585837187792579680441# 题目附件给出的e
    e = 4153390199995099394559502199356876987641001700181798065618463687883377896662802735692294514592974848815256220220567520414785101204978084883084168277609953983317089255372031928914225544973810429741972241310760306291217083076283386527880407979441234845945200062237779009000326020732264366320464844100039711500073849140628815801055506193561725597087896534906132971553150940778821878782222775892376719019037312704365897736892636528690951714686191932520762021674718730306167017168655476030445903413293206451445350127989832224321862119769332948547212450481322973363484001293075189230923276019258476580885163774258459928467# 题目附件给出的c
    c = 100933162705070380579705358896231615705264597351634019368382319632347917048149032133717183415739431564428093428992978229723659108455837366449426780119900838833128284699424510443364272415543344735540591444863458191423494866766098524960586274161507718151409519858841560317649453200969001613445259145496747256869
    # print(pow(m, e, n) == c1) True# 未降低难度前给出的加密流程
    """😀😀😀😀😀"""
    c2 = (mod(m ** 2, n) * power_mod(e, 2, n)) % n
    print(c2 == c) # False
    

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

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

相关文章

大语言模型 (LLM) 与多模态大模型 (MLM)

文章目录概述:从“模型”到“大”模型1、大语言模型 (Large Language Model, LLM)1.1 定义与概述关键特征:1.2 核心技术与架构Transformer架构自注意力机制 (Self-Attention)1.3 训练过程1.4 工作原理2. 多模态大模型 (Multimodal Large Model, MLM)2.1 …

HTML应用指南:利用GET请求获取全国招商银行网点位置信息

招商银行(China Merchants Bank, CMB)作为中国领先的股份制商业银行,始终坚持“以客户为中心”的服务理念,致力于为个人客户、企业客户及机构客户提供专业、高效、便捷的综合金融服务。依托“轻型银行”战略与“金融科技银行”建设…

JVM性能监控工具的使用

了解JVM性能监控工具并能熟练使用,是Java开发者进阶的必备技能。下面本文将为你介绍一些主流的JVM性能监控工具及其使用方法,并通过一些场景案例来分析如何应用这些工具解决实际问题。 🛠️ JVM性能监控与调优工具指南 ✨ 工具概览 以下是几款…

【工作】一些找工作需要了解避雷的知识

面试前 1.公司的具体情况 公司全称,办公地点,涉及岗位 要求hr做个简单的公司介绍 2.岗位职责/业务方向 工作内容、公司业务 3.薪资待遇,构成,底薪,五险一金 问一下工资范围 底薪 (有责,无…

五、练习2:Git分支操作

练习2:Git分支操作 练习目标 掌握Git分支的创建、切换、合并等操作,理解分支在开发中的作用。 练习步骤 步骤1:准备基础仓库 # 创建练习目录 mkdir branch-practice cd branch-practice# 初始化仓库 git init# 创建初始文件 echo "# 分支…

【笔记】算法设计:异或空间线性基

Content1.什么是异或(定义和性质)2.异或空间线性基的构造方法3.异或空间线性基的应用4.算法设计例举5.小结说明算法设计应用之前,首先明确异或空间线性基:一种数据结构。用于处理异或关系(运算)下的向量空间…

Filebeat采集数据与日志分析实战

🌟Filebeat采集数据的原理 Filebeat默认按行采集数据,如果数据没有换行,则该条数据无法采集到 属于有状态服务,可以记录上一次采集数据的位置点信息 修改配置文件 vim /etc/filebeat/config/03-log-to-console.yaml filebeat.inp…

Fluent Bit针对kafka心跳重连机制详解(下)

#作者:程宏斌 文章目录disconnectreconnect接上篇:https://blog.csdn.net/qq_40477248/article/details/150957571?spm1001.2014.3001.5501disconnect 断开连接的情况主要是两种: 连接或传输过程中有错误发生 超时, 比如空闲时间超时 ** * Close and …

React 第七十一节 Router中generatePath的使用详解及注意事项

前言 generatePath 是 React Router 的一个实用工具函数,用于根据路径模式和参数对象生成实际的 URL 路径。它在需要动态构建链接的场景中非常有用,比如生成导航链接或重定向路径。 1、基本用法和注意事项 import { generatePath } from react-router-do…

Python 爬虫案例:爬取豆瓣电影 Top250 数据

一、案例背景与目标 豆瓣电影 Top250 是国内权威的电影评分榜单之一,包含电影名称、评分、评价人数、导演、主演、上映年份、国家 / 地区、类型等关键信息。本案例将使用 Python 编写爬虫,实现以下目标: 自动请求豆瓣电影 Top250 的 10 个分…

SPA安全警示:OAuth2.0致命漏洞

OAuth2.0在SPA应用中的安全陷阱SPA(单页应用)通常采用隐式授权(Implicit Flow)或PKCE(Proof Key for Code Exchange)授权模式,但存在以下安全隐患:隐式授权模式的漏洞访问令牌直接暴…

table表格字段明细展示

文章目录1、字段渲染2、异步请求展示明细3、hover展示问题3.1 基本逻辑3.2 hover时长判断3.3 renderhover表格字段明细展示,属于比较小的需求,但是也有一定交互细节,本文选取部分场景。 1、字段渲染 render和渲染组件是有区别的。render常见为…

主网上线后生态极速扩张的 Berachain 生态,有哪些值得关注的项目?

Berachain 是典型的将 DeFi 思维嵌入到共识机制中的 Layer1,其核心是 PoL(Proof of Liquidity)共识。PoL 要求验证者在获得区块奖励前,必须将流动性导入白名单协议,并由市场决定资金流向。这样,验证者的权重…

claude-code对比GitHub-Copilot

Claude Code 文档日期:2025 年 08 月 20 日 定位 项目级开发助手,专注于全局视野和复杂任务的处理。 特点 超长上下文支持:支持 200k 超长上下文,适合处理复杂项目。丰富的自定义命令:提供灵活的命令配置,满…

Roo Code自定义Mode(模式)

什么是自定义模式? 简单来说,自定义模式就像是给Roo Code穿上不同的"职业装"。你可以创建针对特定任务或工作流程量身定制的模式,让Roo在不同场景下表现出专业的行为。 这些模式分为两种类型:全局模式(在所有…

Next.js渲染模式:SSR、SSG与ISR揭秘

Next.js 核心渲染模式深度解析:SSR、SSG 与 ISR 在构建现代 Web 应用时,性能和用户体验是至关重要的考量。Next.js 作为 React 生态中一个备受推崇的框架,其强大的服务端渲染(SSR)、静态站点生成(SSG&#…

Veo Videos Generation API 对接说明

本文介绍了如何对接 Veo Videos Generation API,通过输入自定义参数生成Veo官方视频。 下面将详细阐述 Veo Videos Generation API 的对接流程。 申请流程 使用 API 前,需前往 Veo Videos Generation API 页面申请服务。进入页面后,点击「…

YOLO 目标检测:YOLOv3网络结构、特征输出、FPN、多尺度预测

文章目录一、YOLOV31、网络结构1.1 整体结构1.2 主干网络1.3 特征输出1.4 特征融合FPN(Feature Pyramid Networks)FPN 融合上采样融合2、多尺度预测3、损失函数4、性能对比一、YOLOV3 YOLOv3(You Only Look Once v3)是YOLO系列中…

【GIS图像处理】有哪些SOTA方法可以用于将1.5米分辨率遥感图像超分辨率至0.8米精度的?

针对将1.5米分辨率遥感图像超分辨率至0.8米的需求,当前主流方法可分为以下几类,结合最新研究进展和实际应用场景,具体技术方案及SOTA方法如下: 一、基于Transformer的高效建模 1. Top-k标记选择Transformer(TTST) 核心机制:通过动态选择前k个关键标记(token),消除冗…

【电力电子】逆变器控制策略:PQ Droop下垂控制、电压电流双环控制与SPWM调制

逆变器中的 PQ Droop 控制。 1. PQ Droop 控制的定义 PQ Droop(有时也称为功率下垂控制,Power Droop Control)是微电网、并联系统或逆变器并网运行中常用的一种分布式功率控制方法。 P-Droop(有功下垂):通过调节逆变器输出频率与有功功率之间的关系实现功率分配。 Q-Dro…