题目描述:

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)

[2023-DAS x SU战队2023开局之战] crypto-sign1n相关推荐

  1. [DASCTF Apr.2023 X SU战队2023开局之战] crypto复现

    感觉突然啥都不会了,后来拿到官方WP,也没整明白,这官方的WP没有代码只讲了些道理,复现一下也不容易. 1,easySign 这是个自制的签名题. from secret import r, t fr ...

  2. 【华为软件特战队2023.2.20笔试题】 最小缩进操作次数

    [软件特战队2023.2.20笔试题] 最小缩进操作次数 题目描述 解题思路 伪代码 完整代码 结尾 朋友分享给我的,简单记录下 题目描述 请实现一个简单的代码缩进功能,把一段未缩进的代码,通过多次操 ...

  3. SUSCTF 2022圆满落幕,SU战队夺冠

    2022年02月28日09:00,第七届XCTF国际网络攻防联赛分站赛SUSCTF 2022顺利落幕.本场赛事由XCTF国际联赛主办,东南大学SUS战队组织,赛宁网安提供技术支持. 赛事共吸引来自全球 ...

  4. OTA巨头的开局之战:战线逐渐下沉 边界更加模糊

    OTA巨头的开局之战:战线逐渐下沉 边界更加模糊 时代周报特约记者 曾宪天 发自广州 新年旅游市场的第一场开局硬仗结束,可能预示着旅游巨头在今年的比拼会更加激烈. 近日,中国旅游研究院(文化和旅游部数 ...

  5. 引爆互联网文娱产业,华为云打响5G开局之战

    2020年初的一场疫情,引发了移动互联网的爆发性增长,意外点出了2020数字产业的"开门红".据QuestMobile 2020中国移动互联网"战疫"专题报告, ...

  6. 北斗导航新年开局之战,第二十六、二十七颗北斗导航卫星成功发射

    预计到2018年底,我国将相继发射18颗北斗三号组网卫星,全面覆盖"一带一路"沿线国家. 1月12日7时18分,我国第二十六.二十七颗北斗导航卫星在西昌卫星发射中心以"一 ...

  7. 力扣杯2023春-个人赛、战队赛

    文章目录 力扣杯2023春-个人赛 [LCP 72. 补给马车](https://leetcode.cn/problems/hqCnmP/) 模拟 [LCP 73. 探险营地](https://lee ...

  8. 博客摘录「 BCD码指令 AAA DAA AAS DAS AAM AAD」2023年4月7日

    可见,AAS指令将影响状态标志位AF和CF,但SF.ZF.PF和OF状态标志位不确定.    例如想要进行两位十进制数的减法运算:13-4=?,可先将被减数和减数以非压缩型BCD码的形式分别存放在AH ...

  9. 华硕无畏15i 2023评测 华硕无畏15i 2023值得入手吗

    华硕无畏15i 2023搭载的是i5-13500H标压处理器,这颗处理器隶属于英特尔最新的第13代酷睿平台,由新一代英特尔7工艺打造,基础功耗45W,具备12核16线程的强大规格,最高睿频4.7GHz ...

最新文章

  1. 王侠对话农民丰收节交易会 万祥军:解读供销社服务平台
  2. c++ pdflib输出表格_DescrTab2包,输出SCI级别的描述统计表
  3. 案例分析:程序媛记一次特殊的“故障”处理
  4. Leetcode每日一题:20.valid-parentheses(有效的括号)
  5. html 将光标移动到某行,如何将QTextBrowser(其中包含html表)的光标移动到PyQt5中的特定行?...
  6. Linux Shell 流程控制语句实例
  7. js调用百度地图搜索功能
  8. Python实现指定GitHub项目下载器【项目下载+GUI可视化界面操作】
  9. android svn新建分支,android studio中创建、切换svn分支
  10. vim 插件安装和卸载
  11. 腾讯云IM集成问题汇总
  12. 解决非root用户没有权限运行docker命令的问题
  13. python对时间序列的DataFrame数据按时间段进行切分求和
  14. 《近匠》专访启明星辰安全研究中心副总监侯浩俊——物联网安全攻防的“线上幽灵”
  15. Technica Engineering Enhanced Ethernet Switch, 车载以太网交换机功能介绍(100/1000BASE-T1 Switch, AVB/TSN)
  16. java 连接池配置_【Java】java数据库连接池配置的几种方法
  17. Java 后端技术清单 2023版
  18. thinkphp创建临时表
  19. Day24-Ajax
  20. Dagger2实战(详细)

热门文章

  1. 安利一个学习数据结构的宝藏网站
  2. c语言中int默认是有符号还是无符号,C语言迷题:有符号数与无符号数的问题
  3. HTML中字体加粗属性或标签
  4. PM,RD,FE,UE,UI,QA,OP,DBA,BRD,MRD,PRD,FSD
  5. 利用tailscale进行个人远程办公和单机游戏开黑
  6. 微信——企业付款到个人银行卡。
  7. Python爬虫爬取马蜂窝北京景点信息
  8. 【彩彩只能变身队】第六次会议
  9. ESP8266_SNTP(Simple Network Time Protocol)
  10. 3. 大数据存储与管理