栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

AES

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AES

一个AES签到 前提

AES_CBC 是什么

同时需要知道AES_ECB是什么

就是上面的图去掉异或和iv

最后就是 AES常用的块长度了 128bit

题目
from Crypto.Cipher import AES
import binascii
import hashlib
from secret import flag

assert flag[:5] == "flag{" and flag[-1:] == "}"

key = b"J1fx2g1jDak1c***"
l = len(key)

message = b"I have had my invitation to this world's festival, and thus my life has been blessed" + binascii.unhexlify(hashlib.sha256(key).hexdigest())[:10]

iv = flag[5:-1]
message = message + bytes((l - len(message) % l) * chr(l - len(message) % l), encoding = "utf-8")
aes = AES.new(key, AES.MODE_CBC, iv)
print(binascii.hexlify(aes.encrypt(message)))
#******************************************************************************************************************************************************6ece036e495d363b647d7f2749c4c2f3dd78f8637b
思路 已知

部分key (有爆破的意思

前半部分明文+后半部分与key有关 (明确爆破了

再看密文 只有后42个hex(168bit

那么分析一下哈

先看密文

40+128==168

再算一下 明文长度

bytes((l - len(message) % l) * chr(l - len(message) % l), encoding = "utf-8")

(这个的值是b'x02x02'不要问我怎么知道的哈 你没有python环境么???

84+10+2

96 (char

96*8

768/128 (bit/bit

6块

不知道你们能不能看明白哈 (反正给你标单位了

过程

根据分析发现不用任何填充 正好6块

所以 已知第六组对应的明文和密文 (当然得爆破

既然爆破就得知道正确与否 怎么验证呢

用密文多出的 40bit 进行验证

OK!那么就真知道了第六组对应的明文和密文

密文使用key通过AES_ECB 解密 得到一个中间值

这个中间值再与明文异或 就得到第六次加密的 iv 即第五次的密文

按照这个思路往前推 即可知道 最开始的iv 即flag

代码实现

1.首先爆破 先有字典

import string
with open("keytable.txt","wb+") as file :
    for i in string.printable[:62]:
        for j in string.printable[:62]:
            for k in string.printable[:62]:
                key = "J1fx2g1jDak1c"
                key+=i
                key+=j
                key+=k
                file.write(bytes(key.encode()))
                file.write(b"n")

2.爆破

from Crypto.Cipher import AES
import binascii
import hashlib
from tqdm import tqdm

def xor(m: bytes, c: bytes): 
    return bytes([i ^ j for i, j in zip(m, c)])

file = open("keytable.txt","rb+")
enc = b"5d363b647d7f2749c4c2f3dd78f8637b"
five_part = binascii.unhexlify(b"6ece036e49")

pbar = tqdm(range(238328))
for i in file:
    key = i[:16]
    aes = AES.new(key, AES.MODE_ECB)
    dec = aes.decrypt(binascii.unhexlify(enc))
    six = b"ssed"
    six += binascii.unhexlify(hashlib.sha256(key).hexdigest())[:10]
    six += b'x02x02'
    xor_result = xor(six,dec)
    pbar.update(1)
    if five_part in xor_result:
        print(binascii.hexlify(xor_result))  #用于做验证
        print(key)
        print(xor_result)
        break
file.close()

输出

b'd7318ea3725b337f2c26056ece036e49'
'J1fx2g1jDak1c7s4'
b'xd71x8exa3r[3x7f,&x05nxcex03nI'

3.还原iv

from Crypto.Cipher import AES

def xor(m: bytes, c: bytes):
    return bytes([i ^ j for i, j in zip(m, c)])

message = b"I have had my invitation to this world's festival, and thus my life has been ble"
key = b"J1fx2g1jDak1c7s4"
enc = b'xd71x8exa3r[3x7f,&x05nxcex03nI'
aes = AES.new(key, AES.MODE_ECB)

for i in range(int(len(message)/16)):
    enc = xor(aes.decrypt(enc),message[len(message)-16*(i+1):len(message)-16*i])
    print(enc)

输出

b'0x07Sxbf^xd9x1dxd3xfcTxf4Ixa6x9bxf3xa0'
b'xc6xd6Tcxb6x08x9dxa9H4xa1Zxfbxebx08x8f'
b'xb1 t8x0bx9bx18dxa48xf2;rxb1 xc4'
b'x8cxf3xfaxcex93fBxb9xb2xadx01x9dx1a6x80x11'
b'welcome_1234_igd'
特别鸣谢

8神 yyds
(https://github.com/davidcheyenneone/CTF)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1017834.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号