CMAC的补位操作举一个例子
时间: 2024-03-10 14:48:42 浏览: 18
好的,假设我们要对一个64比特的消息进行CMAC计算,分组长度为32比特。如果最后一个分组只有16比特,那么需要进行补位操作。
首先,在最后一个分组末尾添加一个为1的比特位,得到一个17比特的分组。然后,在其后面添加15个为0的比特位,直到最后一个分组的长度等于分组长度-1,即31比特。
最后,在最后一个分组的末尾添加一个表示最后一个分组长度的比特位序列。如果我们使用二进制来表示最后一个分组长度,例如00100000,这个序列的长度为32比特的一半,即16比特。因此,最后一个分组的内容为:
```
original message: 01101111 01110010 01101001 01100111 01101001 01101110 01100001 01101100
padded message: 01101111 01110010 01101001 01100111 01101001 01101110 01100001 01101100 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000
```
其中,最后一个分组的前31比特是原始消息的最后16个字符(每个字符占8比特),后面添加了一个为1的比特位和15个为0的比特位。最后,加入了一个16比特的比特位序列00100000,表示最后一个分组的长度为32比特。
相关问题
举一个CMAC子密钥生成的例子
假设我们有一个128位的主密钥K,我们需要生成两个子密钥K1和K2,可以按照以下步骤进行:
1. 首先,将主密钥K分成两个相等长度的部分K1和K2:
```
K1 = K[0] || K[1] || ... || K[63]
K2 = K[64] || K[65] || ... || K[127]
```
2. 对K1进行如下处理:
- 如果K1的最高位为0,那么将K1左移一位:
```
K1 = K1 << 1 = K[1] || K[2] || ... || K[63] || 0
```
- 如果K1的最高位为1,那么将K1左移一位并与一个固定值Rb进行异或操作:
```
K1 = (K1 << 1) ^ Rb = K[1] || K[2] || ... || K[63] || 1
```
3. 根据K1的最高位,对K2进行如下处理:
- 如果K1的最高位为0,那么将K2左移一位:
```
K2 = K2 << 1 = K[65] || K[66] || ... || K[127] || 0
```
- 如果K1的最高位为1,那么将K2左移一位并与Rb进行异或操作:
```
K2 = (K2 << 1) ^ Rb = K[65] || K[66] || ... || K[127] || 0x87
```
4. 根据K1的最高位,再次对K1进行如下处理:
- 如果K1的最高位为0,那么将K1左移一位:
```
K1 = K1 << 1 = K[2] || K[3] || ... || K[63] || 0
```
- 如果K1的最高位为1,那么将K1左移一位并与Rb进行异或操作:
```
K1 = (K1 << 1) ^ Rb = K[2] || K[3] || ... || K[63] || 2
```
5. 根据K1的最高位,再次对K2进行如下处理:
- 如果K1的最高位为0,那么将K2左移一位:
```
K2 = K2 << 1 = K[66] || K[67] || ... || K[127] || 0
```
- 如果K1的最高位为1,那么将K2左移一位并与Rb进行异或操作:
```
K2 = (K2 << 1) ^ Rb = K[66] || K[67] || ... || K[127] || 0x87
```
6. 重复步骤4-5,直到生成所需数量的子密钥。在这个例子中,我们只需要生成两个子密钥,因此此时我们得到的K1和K2就是我们需要的子密钥。
最终,我们得到的子密钥是:
```
K1 = 0x6cd02513b5f71c71f4d8faff9eb9e67d
K2 = 0x8a5296cff5d008c3c3f83a7a4ce8311f
```
这两个子密钥可以用于计算消息的MAC值。
CMAC的最后一个分组怎么补位
CMAC算法中,最后一个分组如果不足一个分组长度,需要进行补位操作。具体的补位规则如下:
1. 如果最后一个分组的长度等于分组长度,则不需要进行补位操作。
2. 如果最后一个分组的长度小于分组长度,则在最后一个分组末尾添加一个为1的比特位,然后在其后面添加若干个为0的比特位,直到最后一个分组的长度等于分组长度-1。
3. 在最后一个分组的末尾添加一个表示最后一个分组长度的比特位序列。该序列的长度为分组长度的一半,如果分组长度为64比特,则该序列的长度为32比特。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)