Crypto
the key to AES
已知题目问题代码:

from secret import flag, key from Crypto.Util.Padding import pad from Crypto.Cipher import AES from hashlib import *assert int(key) % 2 == 0def gen_key(key):padded_key = key.encode() + b'\x0a' * 10assert len(padded_key) == 16return padded_keydef encrypt(msg, key):padded_key = gen_key(key)aes = AES.new(padded_key, mode=AES.MODE_ECB)msg = aes.encrypt(msg)return msgc1 = md5(encrypt(b'0123456789abcdef', key)).hexdigest() c2 = encrypt(pad(flag.encode(), 16), key)print(f'c1: {c1}') print(f'c2: {c2}')''' c1: 7f22b1ca2f586a84f6e676634cc1778a c2: b'#\xa85\xde6\xab\xe1\xc8DWx\xa5O\xf9PJ\xf9\x8e\xf3PR\x9a\xb5H\x17\xe9\x8d\x01\xb9\xf4\x07\x15p\x98\xda\x81l\x17!\xb8\xcb\x88\xa1?\xe93G_' '''
该密钥用 10 个字节的 0x0a 进行填充,以形成一个16字节的 AES 密钥。我们已知 c1,它是字符串 b'0123456789abcdef' 加密后的 MD5 哈希,以及 c2,它是填充后的 flag 的加密结果。通过暴力破解所有可能的偶数16位密钥,我们可以找到生成与 c1 匹配的 MD5 哈希的密钥。一旦找到密钥,我们就可以解密 c2 来获取 flag。
加密和解密函数:encrypt 函数使用 AES-ECB 加密消息,decrypt 函数使用相同密钥解密密文;
暴力破解循环:循环遍历 0 到 999999 之间的所有偶数,并格式化为 6 位字符串。对于每个密钥候选者,加密明文 b'0123456789abcdef',计算 MD5 哈希,并与 c1 比较;
当找到正确的密钥时,解密 c2 并去填充以显示 flag。
from Crypto.Cipher import AES from Crypto.Util.Padding import unpad from hashlib import md5c1 = '7f22b1ca2f586a84f6e676634cc1778a' c2 = b'#\xa85\xde6\xab\xe1\xc8DWx\xa5O\xf9PJ\xf9\x8e\xf3PR\x9a\xb5H\x17\xe9\x8d\x01\xb9\xf4\x07\x15p\x98\xda\x81l\x17!\xb8\xcb\x88\xa1?\xe93G_'def gen_key(key):padded_key = key.encode() + b'\x0a' * 10assert len(padded_key) == 16return padded_keydef encrypt(msg, key):padded_key = gen_key(key)aes = AES.new(padded_key, mode=AES.MODE_ECB)msg = aes.encrypt(msg)return msgdef decrypt(ciphertext, key):padded_key = gen_key(key)aes = AES.new(padded_key, mode=AES.MODE_ECB)msg = aes.decrypt(ciphertext)return msgplaintext1 = b'0123456789abcdef' for i in range(0, 1000000, 2):candidate = str(i).zfill(6)ciphertext1 = encrypt(plaintext1, candidate)hash_value = md5(ciphertext1).hexdigest()if hash_value == c1:#print(f"Key found: {candidate}")flag_padded = decrypt(c2, candidate)flag = unpad(flag_padded, 16)print(flag.decode())break
MISC
gif
题目是一个gif图片文件,可通过下载分帧图片,wps自带的可以直接下载分帧图片或者使用随波逐流。

图片只有11张可以不使用工具,我们打开word将图片拖进去,修改页面宽度就可以对图片进行拼接。(可以不使用工具直接用手拼,很简单)
得到二维码。
再通过扫码得到flag。
paint
通过分析图片的水印,LSB均没有发现。
我们使用010Editor打开发现有一段很奇怪的很长的16进制(应该是关键)。

对16进制转为字符。发现字符为Base64,再通过Base64解码得到坐标。

通过随波逐流工具将坐标转为二维码,在通过扫码得到flag。