2025福建省数据安全大赛决赛wp

Crypto

 the key to AES

已知题目问题代码:

AES_ECB

from secret import flag, key
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES
from hashlib import *

assert int(key) % 2 == 0


def gen_key(key):
    padded_key = key.encode() + b'\x0a' * 10
    assert len(padded_key) == 16
    return padded_key


def encrypt(msg, key):
    padded_key = gen_key(key)
    aes = AES.new(padded_key, mode=AES.MODE_ECB)
    msg = aes.encrypt(msg)
    return msg


c1 = 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 md5

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_'

def gen_key(key):
    padded_key = key.encode() + b'\x0a' * 10
    assert len(padded_key) == 16
    return padded_key

def encrypt(msg, key):
    padded_key = gen_key(key)
    aes = AES.new(padded_key, mode=AES.MODE_ECB)
    msg = aes.encrypt(msg)
    return msg

def decrypt(ciphertext, key):
    padded_key = gen_key(key)
    aes = AES.new(padded_key, mode=AES.MODE_ECB)
    msg = aes.decrypt(ciphertext)
    return msg

plaintext1 = 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自带的可以直接下载分帧图片或者使用随波逐流。

ScreenShot_2025-11-28_054158_883

图片只有11张可以不使用工具,我们打开word将图片拖进去,修改页面宽度就可以对图片进行拼接。(可以不使用工具直接用手拼,很简单)

得到二维码。

再通过扫码得到flag。

 paint
通过分析图片的水印,LSB均没有发现。

我们使用010Editor打开发现有一段很奇怪的很长的16进制(应该是关键)

 

ScreenShot_2025-11-28_062531_367

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

ScreenShot_2025-11-28_062848_561

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

posted @ 2025-11-28 07:06  Cayan  阅读(0)  评论(0)    收藏  举报