簡體   English   中英

如何從 EXTERNAL AUTHENTICATE 命令 apdu 計算 C-MAC?

[英]How to calculate C-MAC from EXTERNAL AUTHENTICATE command apdu?

多虧了這些信息,我才能計算出 EXTERNAL_AUTHENTICATE_data 但我該如何計算 MAC?

我知道我的默認 C-MAC 密鑰是 [40 41... 4F]。 我嘗試在 CBC 模式下使用 3DES 加密 [84 82 00 00 10]+EXTERNAL_AUTHENTIFICATE apdu,但它沒有給出我期望的 MAC 值。


本教程的幫助下,這些是我“計算 C-MAC”所遵循的步驟:

1-我使用帶有EXTERNAL_AUTHENTICATE_data的apdu:8482000010448126B770B27702

2 - 我填充這個apdu:8482000010448126B770B27702800000

3 - 我用S-MAC 密鑰的前 8 個字節加密數據:CBC 模式下的單個 DES(密鑰:D1C28C601652A477 / IV:00 00 00 00 00 00 00 00)結果 => 25F7DC3B1FEE1B9018CCD8E66A69B560

4 - 我使用S-MAC 密鑰的最后 8 個字節對此進行加密:EBC 模式下的 3DES(密鑰:0D67AD82D2D2E1C4)結果 => 11E1B058F0EB6910196A68BF1FBA97AA

或者我除此之外的結果是D770D0A0001B05AA

我做錯了零售MAC嗎?

我為 SCP02 開發了 Python class。 MAC相關部分可能會回答您的問題:

from Crypto.Cipher import DES3,DES

ZERO_IV_8 = b"\x00\x00\x00\x00\x00\x00\x00\x00"
last_mac = None


def pad_80(data_list):
    reminder = len(data_list) % 8 
    if reminder != 0:
        return data_list + [0x80,] + [0x00 for i in range(8 - reminder - 1)] 
    else:
        return data_list + [0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]


def calc_mac(command):
    padded_command = self.pad_80(command)
    mac_in = bytes.fromhex(toHexString(padded_command).replace(" ", ""))

    iv = ZERO_IV_8
    if last_mac != None:
        cipher = DES.new(session_mac[:8], DES3.MODE_ECB)
        iv = cipher.encrypt(last_mac)

    cipher = DES.new(session_mac[:8], DES3.MODE_CBC, iv) 
    step1 = cipher.encrypt(mac_in)

    cipher = DES.new(session_mac[8:16], DES3.MODE_ECB)
    step2 = cipher.decrypt(step1[-8:])

    cipher = DES.new(session_mac[:8], DES3.MODE_ECB)
    mac = list(bytes(cipher.encrypt(step2[-8:])))

    last_mac = bytes.fromhex(toHexString(mac).replace(" ", ""))

    return mac

變量session_mac是一個 16 字節的字節字符串,其中包含 session MAC 密鑰。 您還需要將計算出的 MAC 保存在變量中(在我的情況下last_mac ),以將其用作下一個命令 MAC 計算的 IV。

calc_mac function 輸入(命令)是作為 APDU 命令的數字列表。 您需要在 MAC 計算之前修復 CLA 和 LC 值。

我看到兩個錯誤:

  1. 最后一個塊需要加密 3 次而不是 4 次(單個 DES + 3DES 第一輪太多);
  2. 您沒有為 3DES 使用兩個密鑰,在這種情況下,它可能會恢復為單一 DES 加密。

至於最后一點,它使用給定的單個密鑰執行 DES 加密,使用給定的單個密鑰進行解密,然后再次進行最終加密。 因此,其中兩個操作相互抵消。 這在三重 3DES 的設計中是有意的,以使單個硬件實現能夠同時完成這兩項工作。

我認為這是在前面的問題中提到的,但請注意,MAC 通常使用位填充:總是填充0x80的字節,有盡可能多的0x00字節到達下一個塊邊界。

請注意,Bouncy Castle 包含 Retail MAC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM