用以前的的博客测试一下
贝斯手
题目暗示了是base家族,先后使用base64 32 long_to_bytes
85和58解密即可获得flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from Crypto.Util.number import * from base64 import * import base58
cipher='R1EzVElOQlRHSTNVSU5aVUdRNERNTlpWR0UyREVOS0dHWTJES01aVUlZMkRHTkJSR1JCVE9OUlhHNDNFSU5CWUdSRERNUUpXR00yVElOQlNHUTNUTU1aV0dBMkRPTkJSR1laVE9OSldHQTNES01SV0dZMkRLTVJXSU0zRE9OSlFHVTRETVJCVUdRWlVHTVpVR1VaVE9SQlhJUTJETz09PQ=='
res=b64decode(cipher)
res=b32decode(res)
res=long_to_bytes(int(res,16))
res=b85decode(res)
res=base58.b58decode(res)
print(res)
|
flag:scuctf{M4ny_k1nds_0f_13a5e!}
crypto1
预测随机数,有现成的库可以用。要将312个64位数拆成624个32位数,因为32位输出顺序是abcd,而64位的顺序是badc,所以要反过来取,注意还要填充,脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from Crypto.Util.number import * from randcrack import RandCrack from Crypto.Cipher import AES f=open("./test",'rb') rc=RandCrack()
for i in range(312): a=int(f.readline()) a=bin(a)[2:].zfill(64) c=int('0b'+a[:32],2) b=int('0b'+a[32:],2) rc.submit(c) rc.submit(b) f.close()
res=rc.predict_getrandbits(128) key1=(long_to_bytes(res))
res=open('./out','rb').read() aes = AES.new(key1, AES.MODE_CBC, b"\x00"*16) flag=aes1.decrypt(res) print(flag)
|
flag:scuctf{af0sd_f8}
crypto2
简单的CopperSmith
p是512位的,x是128位,将x首元变为1,转化后p_是1019位的,未知低128位,那么用CopperSmith
Method即可解决。得到的p再在模n下和2^ex相乘即可得到真正的p。附上脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| '''sage n = 85016144249518040150910227120120655178858680112497903474795846550337648959184474608344455198424753002209821827392389091448043545937173891641586356377876821641241033232828279439195610943286663032638048058568003136520988549470764306016674503217880123290623177055115638997384030786304744623796469032887028528817 e = 65537 c = 83724265903365973936178131138176403586796491037282811488797349096425411605088349291193550728134684573063610685342590513444340298881918101517014943046522979731970278182306111863948764449232289625176702192589838375986050458189860493609407060988207562417247647655585368569618561494059816502622854344519538215287 pbar = 4450463823628350893648746241337847373556196959762621885713665365237037340874488165755826348254697529157574566792939002187459776672801308978738078688091668148118673194644809701286264701999481650571431714684293423463355990167658855533422964048092514208406515703766237697665676941598677911363439038209842058509 kbits = 128 PR.<x> = PolynomialRing(Zmod(n)) f = x + pbar x0 = f.small_roots(X=2^kbits, beta=0.5)[0] p = x0 + pbar print(p)
''' from Crypto.Util.number import * import random import gmpy2 from sympy import nextprime leak=1145141920069 n= 85016144249518040150910227120120655178858680112497903474795846550337648959184474608344455198424753002209821827392389091448043545937173891641586356377876821641241033232828279439195610943286663032638048058568003136520988549470764306016674503217880123290623177055115638997384030786304744623796469032887028528817 c= 83724265903365973936178131138176403586796491037282811488797349096425411605088349291193550728134684573063610685342590513444340298881918101517014943046522979731970278182306111863948764449232289625176702192589838375986050458189860493609407060988207562417247647655585368569618561494059816502622854344519538215287 pbar=4450463823628350893648746241337847373556196959762621885713665365237037340874488165755826348254697529157574566792939002187459776672801308978738078688091668148118673194644809701286264701999481650571431714684293423463355990167658855533422964048092514208406515703766237697665676941598677911363439038209842058509 ex = 384 p_=4450463823628350893648746241337847373556196959762621885713665365237037340874488165755826348254697529157574566792939002187459776672801308978738078688091668148118673194644809701286264701999481650571431714684293423463355990167658855533422964048092514208406515703766237697896644308153471350247313227602240058029 p=p_*2**ex%n q=n//p phi=(p-1)*(q-1) d=gmpy2.invert(65537,phi) m=gmpy2.powmod(c,d,n) print(long_to_bytes(m))
|
flag:scuctf{f05fe93d159b398fe25f280d94241261}