Python源码:
#coding: utf-8
from Crypto.Cipher import AES
# 先求出bytes_to_long(key) ^ bytes_to_long(iv)的值:
l_num_0 = 3657491768215750635844958060963805125333761387746954618540958489914964573229
l_num = l_num_0 ^ 1
print(l_num.bit_length())
print(hex(l_num))
print(len(hex(l_num)))
print(len(hex(l_num)[2:]))
# 将整数转换为二进制字符串,并去掉'0b'前缀
s_binary_l_num = bin(l_num)[2:]
# 指定我们想要的二进制字符串的总长度(bits):32 Byte * 8 bits/Byte
total_length = 32 * 8
# 使用zfill()方法,对高位补0
s_padded_binary = s_binary_l_num.zfill(total_length)
# 输出结果
print('s_padded_binary:', s_padded_binary)
print('长度:', len(s_padded_binary), 'bits')
'''
在task_1.py中:
key = os.urandom(16) * 2
“* 2”的作用:重复1次,生成2份相同的16字节,也就是key的前16个字节与后16个字节一模一样。
这就是这道题的突破口。
iv是16个字节。
所以,key与iv做异或运算的时候,根据异或运算的特性,运算结果的前16个字节(也就是key的前16个字节)在异或运算的前后始终保持不变,
这样,
两个“前16个字节”就可以拼接成1个完整的key。
由此,我们可以得到key,进而,得到iv。
'''
# 输出结果
s_half_key_binary = s_padded_binary[0:16*8]
print('半个key:', s_half_key_binary)
print('长度:', len(s_half_key_binary), 'bits')
byte_half_key = int(s_half_key_binary, 2).to_bytes(16, byteorder='big')
print('半个key:', byte_half_key)
print('长度:', len(byte_half_key), 'Bytes')
# 完整的key
key = byte_half_key * 2
'''
因为:
iv ^ key ^ 1 = l_num_0
iv ^ key = l_num
所以,
iv ^ key ^ key = l_num ^ key
根据异或运算的性质,自己跟自己进行异或运算,结果为0(突然想到:自己一定要善待自己,不能跟自己过不去,否则,到头一场空)。
即:
iv ^ 0 = l_num ^ key
再根据异或运算的性质:
0跟任何数异或,都等于任何数,就像没运算一样。
所以,最终:
iv = l_num ^ key
'''
iv = l_num ^ int.from_bytes(key, "big")
print('iv:', iv)
byte_iv = iv.to_bytes(16, byteorder='big')
print('iv:', byte_iv)
print('长度:', len(byte_iv), 'Bytes')
b_miwen = b'>]\xc1\xe5\x82/\x02\x7ft\xf1B\x8d\n\xc1\x95i'
print('密文:', b_miwen)
print('密文的长度:', len(b_miwen))
# 创建AES解密器,使用CBC模式和PKCS7填充
aes_obj = AES.new(key, AES.MODE_CBC, byte_iv)
# 解密密文
b_flag = aes_obj.decrypt(b_miwen)
print('flag:', b_flag.decode('utf-8'))
运行结果:
252
0x8161125a0a6c5cb5e02994e4660ea2ceb4c0862c198c2078fa3c14f2571fc2c
65
63
s_padded_binary: 0000100000010110000100010010010110100000101001101100010111001011010111100000001010011001010011100100011001100000111010100010110011101011010011000000100001100010110000011001100011000010000001111000111110100011110000010100111100100101011100011111110000101100
长度: 256 bits
半个key: 00001000000101100001000100100101101000001010011011000101110010110101111000000010100110010100111001000110011000001110101000101100
长度: 128 bits
半个key: b'\x08\x16\x11%\xa0\xa6\xc5\xcb^\x02\x99NF`\xea,'
长度: 16 Bytes
iv: 302202574475978703628553716363728852480
iv: b'\xe3Z\x19Ga>\x07\xcc\xd1\xa1X\x01c\x11\x16\x00'
长度: 16 Bytes
密文: b'>]\xc1\xe5\x82/\x02\x7ft\xf1B\x8d\n\xc1\x95i'
密文的长度: 16
flag: firsT_cry_Aes
进程已结束,退出代码为 0