Aes
CBC-MAC 8 字節 ICV 與 16 字節塊大小兼容?
我正在嘗試在 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 $ .