from pwn import *
host = "mercury.picoctf.net"
port = 64260
io = connect(host, port)
# ----------------------
io.recvline() # welcome
io.recvline() # flag!
enc_flag_hex = io.recvline().rstrip().decode()
log.info(f"enc_flag_hex: {enc_flag_hex}")
enc_flag = bytes.fromhex(enc_flag_hex)
io.sendlineafter(b"What data would you like to encrypt? ", b"a" * 50000)
io.recvline() # Here ya go!
time.time()
は秒単位のunixtimeなので、シードとしては弱いCryptoHack – Symmetric Ciphers challenges
をまとめる形で記載する。
暗号化
復号
AES-128について。
128bit == 16バイトのキーを使うブロック暗号。16バイトの平文をそのキーと併せて暗号化する。16バイト未満を扱うにはパディングが、16バイト超を扱うには暗号化モード(ECB, CBC, CTR, …)がそれぞれ必要となる点に注意。
AES-128は10回のラウンドで構成される。複数のラウンドは、後述のconfusionのためとも言えるし、線形性を失わせるためとも言える。
以下、順を追って暗号化アルゴリズムを説明。
Key Expansion: 各ラウンドで使用する鍵を、元の共有鍵から構成する。
ラウンド0 (勝手に命名)