2018/11/19-湖湘杯Re-Common Crypto

Common Crypto

题目链接:https://pan.baidu.com/s/1NMXHOyu8F6YzbjDx84I2eg
提取码:qt6u 

 

首先要求输入32个字符,然后接着两个函数的是对输入的前16位进行aes加密。

 

在第一个函数是aes的一部分对密钥进行处理,我们在里面发现找到密钥赋值的部分,密钥为16个字节,可以写出密钥的十六进制为{0x1b,0x2e,0x35,0x46,0x58,0x6e,0x72,0x86,0x9b,0xa7,0xb5,0xc8,0xd9,0xef,0xff,0xc}

 

 

下面的一个函数即是对输入的前16位进行了加密,后16位没有变化。

紧接着是一个do-while循环,对aes加密后的输入的32位的每个个字节进行处理。每个字节经过函数后能生成两个字节。

 

 

这个do-while循环中的fun作用是将每个字节的十六进制以两个字节的形式写在最后的比较地址上。

例如字符1’,ascii值为31,经过函数后生成0x30x1两个字节。

 

最后经过do-while循环生成64个字节,最后和"934d8706bed74cd6eea683c7be86b2eb32616562363039383965386433333531"进行比较。

 

 

 

我们知道后flag的后16位只经过do-while循环中的函数处理了,我们可以直接根据比较数据的后32位“32616562363039383965386433333531”每两位一组写出flag的后16为  “2aeb60989e8d3351”。

 

16位则是根据密钥加密得到的密文,我们也可以写出来密文的十六进制数组为{0x93,0x4d,0x87,0x06,0xbe,0xd7,0x4c,0xd6,0xee,0xa6,0x83,0xc7,0xbe,0x86,0xb2,0xeb}

 

 

现在我们只需要根据密钥和密文写进行aes解密即可得到flag的前十六位

Python脚本如下

L1=[0x1b,0x2e,0x35,0x46,0x58,0x6e,0x72,0x86,0x9b,0xa7,0xb5,0xc8,0xd9,0xef,0xff,0xc]

for i in range(len(L1)):

    L1[i] = chr( L1[i])

key = ''. join( L1)

aes = AES.new(key, AES.MODE_ECB)

L2=[0x93,0x4d,0x87,0x06,0xbe,0xd7,0x4c,0xd6,0xee,0xa6,0x83,0xc7,0xbe,0x86,0xb2,0xeb]

for i in range(len(L2)):

    L2[i] = chr( L2[i])

cipher = ''. join( L2)

plain = aes.decrypt( cipher)

print plain

 

可以解出来前16位为“hxb2018{853ecfe5”。

 

加上后十六位flag就是“hxb2018{853ecfe52aeb60989e8d3351”我们尝试提交发现flag错误,补全大括号后,显示正确。

flaghxb2018{853ecfe52aeb60989e8d3351}

 

 

 

猜你喜欢

转载自www.cnblogs.com/Fingerprint/p/9981190.html