easy AES

[src = hackme] easy AES

题目描述

Can you encrypt things with AES?
Tips: What is symmetric cipher?

WP

题目给出一个压缩包,解压后是一段py代码。我们在代码行增加注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import base64
from Crypto.Cipher import AES # pip3 install pycrypto

def main(data):
c = AES.new(b'Hello, World...!') #AES.new用第一个参数作为秘钥生产AES对象
plain_text = bytes.fromhex(input('What is your plain text? ')) #输入明文
if c.encrypt(plain_text) != b'Good Plain Text!': #基于上面的AES加密对象加密输入的明文,判断得到的米文娜是否为b'Good Plain Text!'
print('Bad plain text')
exit()

c2 = AES.new(plain_text[::-1], mode=AES.MODE_CBC, IV=b'1234567887654321') #用输入的plain text作为秘钥生产AES对象

decrypted = c2.decrypt(data) #用生产的AES对象解密data

with open('output.jpg', 'wb') as fout: #解密得到的数据写入文件output.jpg
fout.write(decrypted)

main(base64.b64decode('71CyOAtf3umZOhg5JeH8XQieCIfO/mVdmJ08HZ0he11LIUQ+
......后面是一段密文,省略......

整个过程就清晰了,分两个阶段:
首先输入一段明文,使用生产的c这个AES对象加密,要求加密结果为b’Good Plain Text!’,因此可反向思维,明文就是b’Good Plain Text!’基于加密对象c的解密结果。
第二个阶段使用第一个阶段的plain text作为密钥解密data,并写入到output.jpg文件中。

因此可以使用下面的结题脚本:

1
2
3
4
5
6
7
8
9
10
11
import base64
from Crypto.Cipher import AES
c = AES.new(b'Hello, World...!')
plain_text = c.decrypt(b'Good Plain Text!')
c2 = AES.new(plain_text[::-1], mode=AES.MODE_CBC, IV=b'1234567887654321')
data = base64.b64decode('71CyOAtf3umZOhg5JeH8XQieCIfO/mVdmJ08HZ0he11LIUQ+
......后面是一段密文,省略......

decrypted = c2.decrypt(data)
with open('output.jpg', 'wb') as fout:
fout.write(decrypted)

程序输出为图片,里面包含flag:
aes

[知识点]

本题考核对对称加密算法AES的理解以及python中密码学API的使用,遇到没有使用过的API查阅文档也是一个好习惯!
建议:本题其实不需要深入理解AES算法,但是AES算法是一个非常重要的对称加密算法,建议查阅密码学书籍进行深入理解,其实下面的API调用的参数就需要理解AES的工作模式(CBC),分组密码共有5种工作模式,这是其中一种,后面的IV的作用是什么?读者查阅资料来理解。

1
c2 = AES.new(plain_text[::-1], mode=AES.MODE_CBC, IV=b'1234567887654321')