[NewStarCTF 2023 公开赛道]babyaes


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
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值