Aes
AES CBC MAC 拼接攻擊
我正在嘗試在 Python 中實現 AES CBC MAC 拼接攻擊,想法是:
給定一條消息 M,它的標籤 Tm (MAC(M) = T),一條新消息 N 和它的標籤 Tn,我們建構一個消息,例如:M||N = (M1, …, Mn, N1 ⊕ Tn, N2, …, Nn) 與 N 具有相同的標籤(那是因為您插入了一個重置算法的塊)。
這個想法很清楚,但我仍然無法獲得正確的標籤。
這是我的程式碼(我是 Python 新手,抱歉):
from Crypto.Cipher import AES from Crypto.Util.strxor import strxor from binascii import hexlify import argparse import pickle AES_KEY_SIZE = 16 BLOCK_SIZE = AES.block_size def main(): parser = argparse.ArgumentParser() parser.add_argument("f1", type=str, help="f1") parser.add_argument("f2", type=str, help="f2") parser.add_argument("tag1", type=str, help="tag1") parser.add_argument("tag2", type=str, help="tag2") parser.add_argument("k", type=str, help="key") args = parser.parse_args() with open(args.tag2, "rb") as tag2: stored_tag = pickle.load(tag2) with open(args.k, mode="rb") as f: key = pickle.load(f) assert len(key) == AES_KEY_SIZE cipher = AES.new(key, AES.MODE_CBC, b'\0' * BLOCK_SIZE) with open(args.f2, mode="rb") as f2: f2_block1 = f2.read(BLOCK_SIZE) b1 = cipher.encrypt(strxor(f2_block1, stored_tag)) with open(args.f1, mode="rb") as f1: file1 = f1.read() file2 = f2.read() the_rest_of_the_file = file2[BLOCK_SIZE:len(file2)] new = open('newfile.file','w') s = file1 + b1 + the_rest_of_the_file new.write(s) if __name__=="__main__": main()
為完整起見,CBC 定義如下:
你犯的錯誤是:
$$ M;N = (M_1, …, M_n, N_1 ⊕ \mathbf{T_m}, N_2, …, N_n) $$ (我已將符號從 M||N 更改為 M;N 以反映這不僅僅是串聯) 您需要從消息中取消標籤 $ M $ ,而不是來自的標籤 $ N $ 資訊。在這種情況下, $ T_{M;N}=T_N $ 按要求。