[2023-DAS x SU战队2023开局之战] crypto-sign1n

news/2025/2/12 21:02:04/

题目描述:

from secret import r, t
from Crypto.Util.number import *flag = b'xxx'
flag = bytes_to_long(flag)
e = 0x10001def gen_keys():p = getPrime(1024)q = getPrime(1024)phi = (p-1)*(q-1)d = inverse(e,phi)n = p*qprint(f'n = {n}')WHATF = (d ** 3 + 3) % phiprint(f'WHATF= {WHATF}')return d, n, WHATFdef easy_sign(n,d):m = flag * pow(r,e**2+d**2,n) % ns = pow(m,d,n)return s
from secret import r, t
def gift():assert t > 0gift = pow(r,t) - 1#print(t)print(isPrime(gift))d,n,WHATF = gen_keys()
gift()
sign = easy_sign(n,d)
print(f'sign = {sign}')
import gmpy2
from Crypto.Util.number import *
'''
e = 65537
n = 17501785470905115084530641937586010443633001681612179692218171935474388105810758340844015368385708349722992595891293984847291588862799310921139505076364559140770828784719022502905431468825797666445114531707625227170492272392144861677408547696040355055483067831733807927267488677560035243230884564063878855983123740667214237638766779250729115967995715398679183680360515620300448887396447013941026492557540060990171678742387611013736894406804530109193638867704765955683067309269778890269186100476308998155078252336943147988308936856121869803970807195714727873626949774272831321358988667427984601788595656519292763705699
W = 7550872408895903340469549867088737779221735042983487867888690747510707575208917229455135563614675077641314504029666714424242441219246566431788414277587183624484845351111624500646035107614221756706581150918776828118482092241867365644233950852801286481603893259029733993572417125002284605243126366683373762688802313288572798197775563793405251353957529601737375987762230223965539018597115373258092875512799931693493522478726661976059512568029782074142871019609980899851702029278565972205831732184397965899892253392769838212803823816067145737697311648549879049613081017925387808738647333178075446683195899683981412014732
1
s = 12029865785359077271888851642408932941748698222400692402967271078485911077035193062225857653592806498565936667868784327397659271889359852555292426797695393591842279629975530499882434299824406229989496470187187565025826834367095435441393901750671657454855301104151016192695436071059013094114929109806658331209302942624722867961155156665675500638029626815869590842939369327466155186891537025880396861428410389552502395963071259114101340089657190695306100646728391832337848064478382298002033457224425654731106858054291015385823564302151351406917158392454536296555530524352049490745470215338669859669599380477470525863815
'''

题目分析:

  • 已知:

    W = (d ** 3 + 3) % phi
    m = flag * r ^ (e ^ 2 + d ^ 2) % n
    s = m ^ d % n
    
  • 推导:

    m = flag * r ^ (e ^ 2) * r ^ (d ^ 2) % n两端同时*dm ^ d = flag ^ d * r ^ e * r ^ (d ^ 3) % n已知 s = m ^ d, 故s = flag ^ d * r ^ (e + d ^ 3) % n两端同时*es ^ e = flag * r ^ [e * (e + d ^ 3)] % n对 r ^ [e * (e + d ^ 3)] 求逆元,记为 d'
    有 r ^ [e * (e + d ^ 3)] * d' = 1 mod n
    则:
    d' * s ^ e = flag 
    flag  = d' * s ^ e % n (保证不越界)
    
  • 所以要求到d’则要求出r
    d’ = gmpy2.invert( r ^ [e * (e + d ^ 3)] , n)

  • 不难看出,r 即为此题关键,在此则要看gift()函数

def gift():assert t > 0gift = pow(r,t) - 1#print(t)print(isPrime(gift))

t = 1已经给出
在这里插入图片描述
讲得很有道理,所以t = 2
自此所有参数均已得知,flag也就出来了
解题代码如下:

import gmpy2
from Crypto.Util.number import *
e = 65537
n = 17501785470905115084530641937586010443633001681612179692218171935474388105810758340844015368385708349722992595891293984847291588862799310921139505076364559140770828784719022502905431468825797666445114531707625227170492272392144861677408547696040355055483067831733807927267488677560035243230884564063878855983123740667214237638766779250729115967995715398679183680360515620300448887396447013941026492557540060990171678742387611013736894406804530109193638867704765955683067309269778890269186100476308998155078252336943147988308936856121869803970807195714727873626949774272831321358988667427984601788595656519292763705699
W = 7550872408895903340469549867088737779221735042983487867888690747510707575208917229455135563614675077641314504029666714424242441219246566431788414277587183624484845351111624500646035107614221756706581150918776828118482092241867365644233950852801286481603893259029733993572417125002284605243126366683373762688802313288572798197775563793405251353957529601737375987762230223965539018597115373258092875512799931693493522478726661976059512568029782074142871019609980899851702029278565972205831732184397965899892253392769838212803823816067145737697311648549879049613081017925387808738647333178075446683195899683981412014732
t = 1
s = 12029865785359077271888851642408932941748698222400692402967271078485911077035193062225857653592806498565936667868784327397659271889359852555292426797695393591842279629975530499882434299824406229989496470187187565025826834367095435441393901750671657454855301104151016192695436071059013094114929109806658331209302942624722867961155156665675500638029626815869590842939369327466155186891537025880396861428410389552502395963071259114101340089657190695306100646728391832337848064478382298002033457224425654731106858054291015385823564302151351406917158392454536296555530524352049490745470215338669859669599380477470525863815
r = 2
'''
r = 2
m = f * r ^ (e ^ 2 + d ^ 2)= f * r ^ (e ^ 2) * r ^ (d ^ 2)
m ^ d = f ^ d * r ^ e * r ^ (d ^ 3) % n* r ^ (W - 3) % n
s = f ^ d * r ^ (e + W - 3) % n
s ^ e = f * r ^ [e * (e + W - 3)] % n
'''
a = pow(r,e * (e + W - 3),n)
d_a = gmpy2.invert(a,n)
f = pow(s,e,n) * d_a % n
print(long_to_bytes(f))# DASCTF{RSA_Bl1nd_Signatur3_With_M4th}
  • 另一种解法,异曲同工
e = 65537
n = 17501785470905115084530641937586010443633001681612179692218171935474388105810758340844015368385708349722992595891293984847291588862799310921139505076364559140770828784719022502905431468825797666445114531707625227170492272392144861677408547696040355055483067831733807927267488677560035243230884564063878855983123740667214237638766779250729115967995715398679183680360515620300448887396447013941026492557540060990171678742387611013736894406804530109193638867704765955683067309269778890269186100476308998155078252336943147988308936856121869803970807195714727873626949774272831321358988667427984601788595656519292763705699
W = 7550872408895903340469549867088737779221735042983487867888690747510707575208917229455135563614675077641314504029666714424242441219246566431788414277587183624484845351111624500646035107614221756706581150918776828118482092241867365644233950852801286481603893259029733993572417125002284605243126366683373762688802313288572798197775563793405251353957529601737375987762230223965539018597115373258092875512799931693493522478726661976059512568029782074142871019609980899851702029278565972205831732184397965899892253392769838212803823816067145737697311648549879049613081017925387808738647333178075446683195899683981412014732
s = 12029865785359077271888851642408932941748698222400692402967271078485911077035193062225857653592806498565936667868784327397659271889359852555292426797695393591842279629975530499882434299824406229989496470187187565025826834367095435441393901750671657454855301104151016192695436071059013094114929109806658331209302942624722867961155156665675500638029626815869590842939369327466155186891537025880396861428410389552502395963071259114101340089657190695306100646728391832337848064478382298002033457224425654731106858054291015385823564302151351406917158392454536296555530524352049490745470215338669859669599380477470525863815
r = 2from Crypto.Util.number import *
f_d = s * pow(pow(r,e+W-3,n),-1,n)
flag = pow(f_d,e,n)
print(long_to_bytes(int(flag)))#DASCTF{RSA_Bl1nd_Signatur3_With_M4th}

收获与体会:

  • 从两种解法中不难看出求逆元的两种方法:
假设a * d = 1 mod n,其中a已知,d未知
1. d = gmpy2.invert(a,n)
2. d = pow(a,-1,n)
联想:e * d = 1 mod phi
1. d = gmpy2.invert(e,phi)
2. d = pow(e,-1,phi)

http://www.ppmy.cn/news/62080.html

相关文章

一个让人类窒息的AI工具,或许未来人工智能真的能代替人类!

时隔几周,「神采PromeAI」又更新了 不仅页面做了小小的调整 又增加了「背景生成」功能 害怕各位小伙伴找不到使用位置 今天小编就给大家分享一个超全的使用教程 极速出图效率翻倍 让神采PromeAI在应用性设计方面更具优势 温馨提示:目前手机适配端无…

PAVC100R4222 PARKER轴向柱塞泵

PAVC100R4222 PARKER轴向柱塞泵特点: 1、壳体为高强度铸铁 2、两段设计便于维护 3、全密封的轴用轴承 4、内置增压器***高转速性能,可达3000 RPM( PAVC100为2600 RPM) 5、控制器为插装形式,易于现场更换 6、配流盘为可替换的青铜复合 10、过滤…

redis 持久化 RDB + AOF

redis 持久化 RDB AOF 1.redis持久化----两种方式 RDB(Redis DataBase)和AOF(Append Only File) RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上 AOF&am…

MySQL的ID用完了,怎么办?

目 录 一 首先首先分情况 二 自增ID 1 mysql 数据库创建一个自增键的表 2 导出表结构 3 重新创建 自增键是4294967295的表 4 查看表结构 5 异常测试 三 填充主键 1 首先创建一个test 表,主键不自增 2 插入主键最大值 3 再次插入主键最大值1 四 没有声明…

项目角色定义

一、项目集经理的角色 项目集经理是由执行组织授权、领导团队实现项目集目标的人员。项目集经理对项目集的领导、 实施和绩效负责,并负责组建一支能够实现项目集目标和预期项目集效益的项目集团队。项目集经 理的角色与项目经理的角色不同。二者之间的差异是基于项…

【Java EE 初阶】如何保证线程安全

目录 1.线程是什么? 2.线程安全(重点) 1.概念: 1.举例:用两个线程分别对同一个变量做五万次自增,观察答案是否符合预期 那么是哪些原因造成了这种线程不安全的现象呢?我们一起来分析一下&am…

消息队列中的事务消息

大家好,我是易安!今天我们谈一谈消息队列中的事务消息这个话题。 一说起事务,你可能自然会联想到数据库。我们日常使用事务的场景,绝大部分都是在操作数据库的时候。像MySQL、Oracle这些主流的关系型数据库,也都提供了…

K8s基础8——svc基础使用、应用暴露、iptables代理、ipvs代理

文章目录 一、Service基本了解二、Service定义与创建2.1 相关命令2.2 yaml文件参数大全2.3 创建svc2.3.1 两种创建方式类比2.3.2 验证集群内A应用访问B应用2.3.3 将集群外服务定义为K8s的svc2.3.4 分配多个端口 2.4 常用三种类型2.4.1 ClusterIP(集群内部访问&#…