[RoarCTF2019]babyRSA

本文解析了RoarCTF2019中的RSA加密挑战,利用威尔逊定理和逆元计算技巧,解密密文并揭示了旗标。关键步骤包括找到p,q,r的大素数和利用欧拉函数求私钥。最终解得flag:wm-CongrAtu1ation4-1t4-ju4t-A-bAby-R4A。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[RoarCTF2019]babyRSA

附件打开

import sympy
import random

def myGetPrime():
    A= getPrime(513)
    print(A)
    B=A-random.randint(1e3,1e5)
    print(B)
    return sympy.nextPrime((B!)%A)
p=myGetPrime()
#A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
#B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596

q=myGetPrime()
#A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
#B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026

r=myGetPrime()

n=p*q*r
#n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
c=pow(flag,e,n)
#e=0x1001
#c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
#so,what is the flag?

通过自定义的myGetPrime()函数获得三个大质数p,q,r,再加密,重点在于函数的返回值 sympy.nextPrime((B!)%A),返回了B!%A的下一个素数,B!代表B的阶乘。这里看到!就想到了威尔逊定理:(p-1)!+1=0 (mod p),其中p为素数

看看大佬的解题思路:

①首先要知道p,q,r,通过这三个数算出n的欧拉函数phi,p和q可以通过威尔逊定理求出,p和q出来了,r也可求出

②通过威尔逊定理,可知(A-1)!+1≡0 (mod A),故B!(B+1)(B+2)(A-1) ≡ -1 (mod A),故只要求出(B+1)(B+2)…*(A-1)在模数A下的逆(这里设为C1),即

B!≡-1*C1 (mod A),那么B!%A的值就可以求出,也可以得出sympy.nextPrime((B!)%A)

③求出私钥d,解出密文

大佬写的脚本:

import sympy
import gmpy2

A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
e=0x1001
c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733

def mydecrypt(A,B):
    ans=1
    temp=gmpy2.powmod(-1,1,A)
    #print(temp)
    for i in range(B+1,A):
        ans=(ans*gmpy2.invert(i,A))%A
    return (ans*temp)%A

p=sympy.nextprime(mydecrypt(A1,B1))
q=sympy.nextprime(mydecrypt(A2,B2))
r=n//p//q
phi=(p-1)*(q-1)*(r-1)
d=gmpy2.invert(e,phi)
flag=gmpy2.powmod(c,d,n)
import binascii
print(binascii.unhexlify(hex(flag)[2:]))

运行结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fl24jIjh-1626100804380)(C:\Users\86183\Desktop\ZERO\2ero\WP\BUUCTF\Crypto[RoarCTF2019]babyRSA\image-20210712170509702-1626080710798.png)]

RoarCTF{wm-CongrAtu1ation4-1t4-ju4t-A-bAby-R4A}

所以flag为

flag{wm-CongrAtu1ation4-1t4-ju4t-A-bAby-R4A}
对于BuUCTF中的RoarCTF2019年法医鉴定(forensic)类题目,这类挑战通常涉及从给定的数据集中提取有用的信息来解决问题。虽然具体到RoarCTF2019 forensic challenge的官方解决方案未直接提及[^1],可以基于一般性的网络取证分析方法提供指导。 ### 法医鉴定类题目的通用解决策略 #### 数据收集 在处理任何法医鉴定类型的竞赛题目时,数据收集是最基础也是最重要的一步。这可能涉及到获取文件、日志记录或其他形式的数据源。参赛者需仔细阅读题目描述,理解所给材料及其背景故事。 #### 工具准备 为了有效地解析和分析这些数据,选择合适的工具至关重要。常见的工具有Wireshark用于抓包分析,Volatility针对内存转储文件的记忆体分析,以及各种哈希校验程序确保文件完整性验证等。 #### 文件格式识别与恢复 许多情况下,选手会遇到损坏或被隐藏起来的重要文档。了解不同文件头信息可以帮助快速判断未知二进制流的实际类型,并利用专门软件尝试修复它们的内容结构以便进一步查看内部细节。 #### 日志审查 如果比赛提供了服务器端或者客户端产生的活动日志,则应重点关注异常行为模式如频繁连接请求失败次数过多可能是暴力破解攻击迹象;不寻常的时间戳分布也许暗示着定时任务的存在等等特征。 #### 密码学基础知识应用 有时加密技术也会成为解密敏感资料的关键所在。掌握基本编码转换规则(Base64)、常见散列算法特性(MD5/SHA系列),甚至古典密码体制原理都能够在特定场景下发挥重要作用。 ```python import hashlib def md5_hash(string): result = hashlib.md5(string.encode()) return result.hexdigest() print(md5_hash('example')) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值