题目
根据源码:
key=os.urandom(2)*16
iv=os.urandom(16)
可知key是256bits,iv是128bits。
输出的结果是key与iv的异或,所以key的高128位保持不变,又因为key的生成每16位相同,所以可以得到key的值。
out = 91144196586662942563895769614300232343026691029427747065707381728622849079757
out = long_to_bytes(out)
key = out[:16]*2
再用key的后128位(前128也一样)与输出的out后128位进行异或就可以恢复iv的值。
iv = (bytes_to_long(out[16:]))^(bytes_to_long(key[16:]))
iv = long_to_bytes(iv)
key与iv的值都知道了,调用aes库解一下密文即可。
完整EXP:
from Crypto.Util.number import *
from Crypto.Cipher import AES
import os
enc_flag = b'\x8c-\xcd\xde\xa7\xe9\x7f.b\x8aKs\xf1\xba\xc75\xc4d\x13\x07\xac\xa4&\xd6\x91\xfe\xf3\x14\x10|\xf8p'
out = 91144196586662942563895769614300232343026691029427747065707381728622849079757
out = long_to_bytes(out)
key = out[:16]*2
#print(key)
iv = (bytes_to_long(out[16:]))^(bytes_to_long(key[16:]))
iv = long_to_bytes(iv)
#print(iv)
aes=AES.new(key,AES.MODE_CBC,iv)
flag = aes.decrypt(enc_flag)
print(flag)
结果:
但有一点比较迷,就是拿到的flag一直提交失败,不过不重要。