Aes

CBC-MAC 8 字節 ICV 與 16 字節塊大小兼容?

  • February 13, 2018

我正在嘗試在 CoAP 的預共享密鑰模式下使用 DTLS,這需要使用 CipherSuite TLS_PSK_WITH_AES_128_CCM_8

我正在嘗試從 CBC-MAC 開始,但我不確定如何從中獲得 8 個八位字節的 ICV?

我是否只是截斷輸出並僅使用前 8 個八位字節?

我是否使用 8 個八位字節塊大小而不是我用於硬體加速的 CBC 函式強加的 16 個字節?

const unsigned char k[16] ="lbsHgUDHKgeinLfU";//key 128bits                


const unsigned char message[16] = "Hello world!  ";//multiple of 16 bytes as required
unsigned int mLen = sizeof(message);//16

unsigned char zeroInit[16]= {0};


//CBC-MAC with 8byte ICV
//uint8_t mac[8];//8 octet ICV (hopefully)
uint8_t mac[16];

esp_aes_crypt_cbc( &c,ESP_AES_ENCRYPT,mLen,zeroInit, message, mac);

我得到的輸出是: ad ea 26 07 25 bb 43 8a 85 b5 ec ca 6c b6 b5 d3

我看到的數組大小為 8 的唯一區別是我只看到前 8 個字節。

通常,身份驗證標籤大小確實是通過簡單地使用第一個(最左邊,在大多數字節數組表示中)位來生成的。一般來說,Tlen - 標籤的長度 - 應該是 8 的倍數,因此 64 位的標籤大小導致最左邊的 8 個字節。

您不能只更改塊密碼的塊大小。AES 僅支持 128 位 / 16 字節的塊大小(儘管 Rijndael 支持 128 和 256 位之間的任何塊大小,包括使用 32 位增量)。因此,更改密碼的塊大小通常是不可能的。


僅使用完整 MAC 輸出中的第一個/最左邊字節的使用非常普遍,以至於我編寫的 AEAD API 介面基於該事實的方法簽名。請注意,MAC 的輸出無論如何都與隨機無法區分,因此原則上您可以使用結果的任何位;然而,使用第一個/最左邊的字節是公認的預設值。


如果不確定:閱讀標準NIST SP-800 38C

放 $ T=\operatorname{MSB}_{Tlen}(Y_r) $

$ \operatorname{MSB}_s(X) $ : 包含的位串 $ s $ 位串的最左邊位 $ X $ .

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