一道比较新颖的RSA题目,记录一下。

题目源码code是一份使用libcst将python代码转换成语法树的结果:https://gitee.com/shanzhuer/YCB2020CTF/blob/main/wp/crypto/CSTPC/code

研究了好几天如何从tree格式还原python源码,今天终于灵光一现可以像这样:
https://gitee.com/shanzhuer/YCB2020CTF/blob/main/wp/crypto/CSTPC/re.py

反编译出来大概是这样一个程序:

from Crypto.Util.number import *
from secret import flag
from gmpy2 import gcd,invertL = lambda x,n: (x-1) // n
mask = 0x1000000000000000000000000000000000000000001000000000000000000000000000000000000000001000000000000000000000000000000000000000001000000000000000000000000000000000000000001000000000000000000000000000000000000000001def genkey(q_len):while True:q = getStrongPrime(q_len)x = getRandomNBitInteger(21 * 8)p = (0b11 << (q_len - 2)) + (mask * x << 32) + getRandomNBitInteger(32) | 1if isPrime(p) and gcd(p*q, (p-1)*(q-1)) == 1:n = p * qbreaklam = (p - 1) * (q - 1) // gcd(p - 1, q - 1)while True:g = getRandomRange(1,n**2)t = L(pow(g,lam,n**2),n)if gcd(t, n) == 1:mi = invert(t,n)breakreturn n, gdef encrypt(em, en, eg):while True:r = getRandomRange(1,en)if gcd(r, en) == 1:breakreturn pow(eg,em,en**2) * pow(r,en,en**2) % en ** 2n,g = genkey(1024)
m = bytes_to_long(flag)
c = encrypt(m,n,g)with open('./output','w') as f:f.write(str(n))f.write(str(c))f.write(str(g))'''
output==
1521743372908865262741416546733910591548610853500085844733002429309461943187859390289514438469431138029742327155080552292148353482583527260905036928681873676910590690604515369082156097890991972036529002074379125852781768163227840719208682860171159807675102132598520553630516018243653510522481924736453744019712183046155976913571639072382518649897680681556092056484077209628330583478716242389217196014744971281141813768285089065970771971055297965442402683859945510279083854176013322215977145866415466285406978295676624195169518720793348311237519665991770047537451030866696493474098850568929871361771005057843597772734669939
17182935853106434552156000242973235447163830121773500236568197605024442194326661775024875519798807572030111480307857300320951850840530988209148807886187645621017508099627757545745639336245954369734638006172025167853060581344069831025048871222431063105497992313498192875386440000165388413756649881630658414888582438874886847913178068438678283916156899042941459703860916134494941088456775398502008253554452695727265612865130636324153487367096232719388029732480649163809469487012795767570191822183380604619418012973980227836144487532425715028905622973414946041906365840421944364576963944984900197084543122524270591503935714991148607970206535002725497916200786583031614820315489438551763815183138455779869077007170244784219707918823982554035267207862797751735753963297336147955740915039747696914982401814918988058619441774772889894314077366470335412754685113906021779451815587350499485409844309485607391216591336333040449090993845288795738383587321963397754587952218055065843686407726598476563934546204870661489543207101599785192979581395907131825642004781909286215355052892759647113584585994597509150346096431670680308943698565351945216678759306776032106537442283821447854590108332260144547689556055865104581337201112820803020668246743885169311
863648306221197750635124745425196485287733709859700519766462873443479989477835142174038244481446326375144863277323343540417622091978033320732567255989085585430678571678599869769434386879698218770145769391707290371335868286266481480373271466740840125969428198800562788665572249208960896267501891632535852190320396169838602667810500961703719552460472143932016984373455906955322312667074626409584698653250639983066416947346882244662804689417035428330928882301594637284386652952787197377006232201693712967161626367703116254329649653417893876309745358698684972093877356732533361390992903606546934678471442627056926239860193354929322747574940866644815762603091845387150827444831558033761225480788522455475839153111041818962772027383066241418652778261162999218370420600422514492862090018841853708591671141896276835621231786624056322374209609443346457938536582983583095572021167562278961259199308384825850064880885913101184242685974806242840264928071983741657212404914669918020659661522378378904161678505168559557067357394739992017508939896926611653368822057827775574315562104006170923083131266087502904761440145085977235289008291047799492322650831732021031334203828302059804998694139677781303843088760696404298821896598357202481736689784980298710997'''

大概分析一下题目逻辑,首先用genkey生成变量n和g

  • genkey函数首先是取1024bit随机素数q,然后生成168bit随机整数x
  • p由三部分组成,第一部分是二进制11左移1022位,也就是说p的最高两bit是11;第二部分是mask和x的乘积左移32位(mask是一个841bit已知数字);第三部分是32bit随机奇数
  • 保证p,q均为素数而且n和phi(n)互素
  • 令lam=phi(n)//gcd(p-1,q-1)
  • g是小于n2随机数, t = ( ( g l a m m o d n 2 ) − 1 ) / / n t=((g^{lam} \mod n^2)-1)//n t=((glammodn2)−1)//n
  • 取满足t与n互素时的g

最后是一个encrypt加密,取随机数r小于n且与n互素,flag明文为m,密文c的计算方式为
c = ( g m m o d n 2 ) × ( r n m o d n 2 ) m o d n 2 c=(g^m \mod n^2) \times (r^n \mod n^2) \mod n^2 c=(gmmodn2)×(rnmodn2)modn2

官方wp说的是生成n 的时候 q 的生成方式存在漏洞,Coron’s reformulation可以寻找 small root 得到 q。

sage exp:

#sage
n=1521743372908865262741416546733910591548610853500085844733002429309461943187859390289514438469431138029742327155080552292148353482583527260905036928681873676910590690604515369082156097890991972036529002074379125852781768163227840719208682860171159807675102132598520553630516018243653510522481924736453744019712183046155976913571639072382518649897680681556092056484077209628330583478716242389217196014744971281141813768285089065970771971055297965442402683859945510279083854176013322215977145866415466285406978295676624195169518720793348311237519665991770047537451030866696493474098850568929871361771005057843597772734669939
pattern_size = 21*8
prime_size = 1024
x = 2**pattern_size
d0 = 2**pattern_size - 1
w = 2**prime_size
u, v = divmod(n, w)
M = matrix([[x, 0, u * d0 % w],
[0, x, v * d0 % w],
[0, 0,         w]])
for vec in M.LLL():bx, ax = vec[0], -vec[1]p = gcd(ax * w + bx, n)if 1 < p < n:q = n // pbreakprint(p)
print(q)
'''
9787474470481321516583907811116784050975187855984788364954675160861205403211324247840212067637176983999500820054406057964296933378541113139512270250546697839698438386830458327691879552029500073063709147376931283083810831691831376813474432585440099538745128476292613686675663760956152736044907627557653985449787171
155478655653037942525133263794295955200584035143380986161473531639421629394805969115409323403832095007381372211471811493072269410254840849498360193853669418648380371521975393539479526042974618290874243863954220667119652955639060155880605495726437338258427169679128098315911593373079694582149691550103531127409
'''

得到n分解因数后,利用PC Cryptosystem,可以解:
python exp:

from gmpy2 import gcd, invert
from Crypto.Util.number import long_to_bytesL = lambda x,n: (x-1) // np = 9787474470481321516583907811116784050975187855984788364954675160861205403211324247840212067637176983999500820054406057964296933378541113139512270250546697839698438386830458327691879552029500073063709147376931283083810831691831376813474432585440099538745128476292613686675663760956152736044907627557653985449787171
q = 155478655653037942525133263794295955200584035143380986161473531639421629394805969115409323403832095007381372211471811493072269410254840849498360193853669418648380371521975393539479526042974618290874243863954220667119652955639060155880605495726437338258427169679128098315911593373079694582149691550103531127409
n = p * q
g = 863648306221197750635124745425196485287733709859700519766462873443479989477835142174038244481446326375144863277323343540417622091978033320732567255989085585430678571678599869769434386879698218770145769391707290371335868286266481480373271466740840125969428198800562788665572249208960896267501891632535852190320396169838602667810500961703719552460472143932016984373455906955322312667074626409584698653250639983066416947346882244662804689417035428330928882301594637284386652952787197377006232201693712967161626367703116254329649653417893876309745358698684972093877356732533361390992903606546934678471442627056926239860193354929322747574940866644815762603091845387150827444831558033761225480788522455475839153111041818962772027383066241418652778261162999218370420600422514492862090018841853708591671141896276835621231786624056322374209609443346457938536582983583095572021167562278961259199308384825850064880885913101184242685974806242840264928071983741657212404914669918020659661522378378904161678505168559557067357394739992017508939896926611653368822057827775574315562104006170923083131266087502904761440145085977235289008291047799492322650831732021031334203828302059804998694139677781303843088760696404298821896598357202481736689784980298710997
c = 17182935853106434552156000242973235447163830121773500236568197605024442194326661775024875519798807572030111480307857300320951850840530988209148807886187645621017508099627757545745639336245954369734638006172025167853060581344069831025048871222431063105497992313498192875386440000165388413756649881630658414888582438874886847913178068438678283916156899042941459703860916134494941088456775398502008253554452695727265612865130636324153487367096232719388029732480649163809469487012795767570191822183380604619418012973980227836144487532425715028905622973414946041906365840421944364576963944984900197084543122524270591503935714991148607970206535002725497916200786583031614820315489438551763815183138455779869077007170244784219707918823982554035267207862797751735753963297336147955740915039747696914982401814918988058619441774772889894314077366470335412754685113906021779451815587350499485409844309485607391216591336333040449090993845288795738383587321963397754587952218055065843686407726598476563934546204870661489543207101599785192979581395907131825642004781909286215355052892759647113584585994597509150346096431670680308943698565351945216678759306776032106537442283821447854590108332260144547689556055865104581337201112820803020668246743885169311lam = (p - 1) * (q - 1) // gcd(q - 1, p - 1)
t = L(pow(g,lam,n**2),n)
miu = invert(t,n)
m = L(pow(c,lam,n**2),n) * miu % n
m = long_to_bytes(m)
print(m)

crypto-CSTPC(羊城杯 2020)相关推荐

  1. [羊城杯 2020]GMC

    [羊城杯 2020]GMC 题目 from Crypto.Util.number import getPrime,bytes_to_long,getRandomNBitInteger from sec ...

  2. [羊城杯 2020]Power

    [羊城杯 2020]Power 题目 from Crypto.Util.number import * import gmpy2 from secret import flagp = getPrime ...

  3. [羊城杯 2020]RRRRRRRSA

    [羊城杯 2020]RRRRRRRSA 题目 import hashlib import sympy from Crypto.Util.number import *flag = 'GWHT{**** ...

  4. [羊城杯 2020]Bytecode [UTCTF2020]babymips

    文章目录 [羊城杯 2020]Bytecode 查看题目 python代码 注意点: BINARY_SUBTRACT 这个是减法 BINARY_SUBSCR 这个是索引 Z3约束脚本 注意点: 注意最 ...

  5. [羊城杯 2020]login [SUCTF2019]hardcpp

    文章目录 [羊城杯 2020]login 思路:一个py编译的exe,需要解包,然后反编译成py文件 1.解包:python pyinstxtractor.py login.exe 提示:pyinst ...

  6. [羊城杯 2020]逃离东南亚

    [羊城杯 2020]逃离东南亚 考点 复现过程 参考链接 考点 1.图片高度隐写 2.silenteye 3.空格与tab隐写 4.需要编程找到隐写内容并进行解码 复现过程 解压压缩包有三个压缩包文件 ...

  7. [羊城杯2020]easyphp --- 伪协议的使用时机,---python上传.htaccess的利用 -- preg_match绕过

    目录: 一. 自己做: 二.学到的.不足: 三. 1. 利用.htaccess来设置文件自动包含 2. 绕过 \n 的过滤 3. 绕过stristr的过滤. 4. 绕过preg_match 2.思路二 ...

  8. buuctf————[羊城杯 2020]login

    1.查壳. 无壳,64位.(当时还不知到PyInstaller ) 2.直接丢到IDA反编译.发现啥也没有. (连个提示性的字符串也没有,但运行是有input something.很迷.) 看了看大佬 ...

  9. [羊城杯 2020]easyre

    用PE查壳 用ida打开找到main函数 int __cdecl main(int argc, const char **argv, const char **envp) {int v3; // ea ...

最新文章

  1. 计算机管理的未来职业发展方向,职业发展方向
  2. jaVa工程师朱璇_使用QTP对Silverlight应用进行自动化测试的研究与实践
  3. linux轮询脚本,linux驱动的等待队列(阻塞操作)和轮询(poll),缓冲区笔记
  4. 蒂森电梯服务器显示4480,成都电梯豪宅市场分析专题报告.docx
  5. c++ ado操作mysql_利用ADO在C++下操作access数据库
  6. V4L2应用程序框架--一【转】
  7. FFmpeg源代码简单分析:av_write_frame()
  8. autotools工具介绍
  9. 翻译: Web 3.0是一种几乎无需信任的承诺的协议/架构
  10. 概率扩散模型 Probabilistic Diffusion Model
  11. EditPlus 3 实现将JSON字符串格式化、排版成JSON格式数据
  12. gmail不支持html格式,gmail邮箱附件如何以html格式查看
  13. 【盘点】2014年跨境进口型电商十大模式
  14. 桌越科技关于程序员和软件开发
  15. 希腊字母以及发音 α β γ
  16. 约数倍数卡片 java_约数倍数选卡片
  17. #资讯 #生活 #科技 李斌称蔚来手机进展顺利,微信iOS版内测更新,威马CEO沈晖回应12亿年薪,迅雷网游加速器停运,这就是今天的其它大新闻
  18. java web网站集成新浪微博登录
  19. ElasticSearch根据坐标点和半径查询范围内的所有记录,并按距离排序
  20. 为什么delphi编译生成的exe文件这么大?

热门文章

  1. Chrome浏览器中如何将开发者工具(F12)语言从英文设置成中文
  2. 许可方式 到底非商业用途意味着什么?
  3. 基于java的大学生社团管理系统设计(含源文件)
  4. 汇编语言与计算机硬件有关吗,汇编语言和硬件的关系
  5. 关于usecase新建与构造配置
  6. 两种常见电商sku的设计
  7. 关于MySQL数据库
  8. 解析EDA系统集成方案设计
  9. 技术分享连载(八十八)
  10. 多媒体信息设计原则对多媒体教学资源的设计和制作有何启示