Aes

AES CBC MAC 拼接攻擊

  • March 26, 2014

我正在嘗試在 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 定義如下: 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 $ 按要求。

引用自:https://crypto.stackexchange.com/questions/15235