他の人のノウハウ集

CTF crypto 逆引き - ふるつき

nc で入出力するプログラムのテンプレ w/ pwntools

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!

シード

AES

アルゴリズム

CryptoHack – Symmetric Ciphers challenges

をまとめる形で記載する。

Overview

暗号化

暗号化

復号

復号

AES-128について。

128bit == 16バイトのキーを使うブロック暗号。16バイトの平文をそのキーと併せて暗号化する。16バイト未満を扱うにはパディングが、16バイト超を扱うには暗号化モード(ECB, CBC, CTR, …)がそれぞれ必要となる点に注意。

AES-128は10回のラウンドで構成される。複数のラウンドは、後述のconfusionのためとも言えるし、線形性を失わせるためとも言える。

アルゴリズム各ステージ詳解

以下、順を追って暗号化アルゴリズムを説明。

  1. Key Expansion: 各ラウンドで使用する鍵を、元の共有鍵から構成する。

  2. ラウンド0 (勝手に命名)

    1. 16バイトの平文を、4x4行列に変換する。

    Untitled

    1. AddRoundKey: Key Expansionで作ったラウンド0用の鍵(16バイト)を、平文行列と1バイトずつXORする。以降、各ステージの出力をステートと呼ぶ。