SCUCTF

用以前的的博客测试一下

贝斯手

题目暗示了是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}