2023羊城杯密码wp

博客围绕Python密码学挑战展开,涉及Danger_RSA、Easy_3L等多个题目。介绍了通过开方、格基规约、预测随机数、维纳攻击、coppersmith方法等技术求解p、q、e、flag等关键信息,还提及社会主义核心价值观编码解码获取压缩包密码及异或操作。

3-1 Danger_RSA

e e e 为34位数,所以 s s s t t t为17位数,求出 a = 4 a=4 a=4,且 s s s t t t有两种可能

s = 3 * 7 * 7 * 691
t = 19 * 5741
s = 7 * 19 * 691
t = 3 * 7 * 5741

根据 g e t _ k e y ( ) get\_key() get_key():
p = X 1 4 + s q = X 2 4 + t N = ( X 1 ∗ X 2 ) 4 + X 1 4 ∗ t + X 2 4 ∗ s + e p=X_1^4+s\\q=X_2^4+t\\N=(X_1*X_2)^4+X_1^4*t+X_2^4*s+e p=X14+sq=X24+tN=(X1X2)4+X14t+X24s+e
N N N开四次方根得到 X 1 ∗ X 2 X_1*X_2 X1X2,这样我们就有了2元方程组,对两组 s s s t t t分别尝试解方程组,最终求得 X 1 X_1 X1 X 2 X_2 X2的整数解,从而求出 p p p q q q

g c d ( e ,   p − 1 ) = 3   &   g c d ( e ,   q − 1 ) = 7 gcd(e,\ p-1)=3\ \&\ gcd(e,\ q-1)=7 gcd(e, p1)=3 & gcd(e, q1)=7

取那个公因子为 3 3 3的素数进行有限域开方。

from Crypto.Util.number import *
from gmpy2 import iroot

N = 20289788565671012003324307131062103060859990244423187333725116068731043744218295859587498278382150779775620675092152011336913225797849717782573829179765649320271927359983554162082141908877255319715400550981462988869084618816967398571437725114356308935833701495015311197958172878812521403732038749414005661189594761246154666465178024563227666440066723650451362032162000998737626370987794816660694178305939474922064726534186386488052827919792122844587807300048430756990391177266977583227470089929347969731703368720788359127837289988944365786283419724178187242169399457608505627145016468888402441344333481249304670223
e = 11079917583
c = 13354219204055754230025847310134936965811370208880054443449019813095522768684299807719787421318648141224402269593016895821181312342830493800652737679627324687428327297369122017160142465940412477792023917546122283870042482432790385644640286392037986185997262289003477817675380787176650410819568815448960281666117602590863047680652856789877783422272330706693947399620261349458556870056095723068536573904350085124198592111773470010262148170379730937529246069218004969402885134027857991552224816835834207152308645148250837667184968030600819179396545349582556181916861808402629154688779221034610013350165801919342549766
a = 4
xx = int(iroot(N, a)[0])

s = 7 * 19 * 691
t = 3 * 7 * 5741
x1, x2 = var('x1 x2')
solve([x1*x2==xx, (x1**4+s)*(x2**4+t)==N],x1,x2, solution_dict=True)
# {x1: 44416071018427916652440592614276227563515579156219730344722242565477265479486, x2: 47783641287938625512681830427927501009821495321018170621907812035456872958654}

p = 44416071018427916652440592614276227563515579156219730344722242565477265479486**4+s
q = N // p
assert gcd(e, q-1) == 3
d = inverse(e//3, q-1)
c = int(pow(c, d, q))

PR.<x> = Zmod(q)[]
f = x^3 - c
res = f.roots()
for i in res:
    print(long_to_bytes(int(i[0])))
# b'DASCTF{C0nsTruct!n9_Techn1qUe2_f0r_RSA_Pr1me_EnC2ypt10N}'

3-2 Easy_3L

c = ( s ∗ h + m s g )   %   p = > − s ∗ h + c − k ∗ p = m s g c = (s * h + msg)\ \%\ p\\=>-s*h +c-k*p=msg c

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mxx307

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值