我试图在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 ca 6c b6 b5 d3
数组大小为8的唯一不同之处是,我只看到前8个字节。
发布于 2018-02-12 23:50:34
通常,身份验证标记大小实际上是通过使用第一个(在大多数字节数组表示中最左边)位来生成的。一般来说,Tlen --标记的长度--应该是8的倍数,因此标记大小为64位,就会产生最左边的8个字节。
您不能只更改块密码的块大小。AES只支持128位/ 16字节的块大小(尽管Rijndael支持128到256位之间的任何块大小,包括32位增量)。因此,改变密码的块大小通常是不可能的。
整个MAC输出中的第一个/最左边字节的使用非常广泛,以至于我编写的AEAD接口基于这个事实编写了方法签名。请注意,无论如何,MAC的输出与随机输出是无法区分的,因此原则上您可以使用结果的任何比特;然而,使用第一个/最左边的字节是常见的默认情况。
如果不确定:阅读标准,NIST SP-800 38C:
设置$T=\operatorname{MSB}_{Tlen}(Y_r)$
和
$\operatorname{MSB}_s(X)$:由位字符串$X$的$s$ 最左边的位组成的位字符串。
https://crypto.stackexchange.com/questions/55586
复制相似问题