You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AES CMAC计算主机密码输出长度不符及处理方式咨询

关于SCP03主机密码(8字节)的AES-CMAC处理问题

让我来帮你理清这个问题的核心点:

1. AES-CMAC的输出特性

首先要明确:AES-CMAC的输出长度固定等于AES的块大小,也就是128位(16字节),不管你传入的派生数据L长度是多少,这个输出长度都是固定的。你之前误以为L会决定CMAC的输出长度,这是对参数作用的误解——L是CMAC计算输入数据中的一个字段(比如SCP03协议里用于描述数据长度的参数),它参与CMAC的计算,但不会改变最终输出的字节数。

2. SCP03规范对主机密码的要求

根据SCP03的协议规范,主机密码(Host Cryptogram)确实需要是8字节长度,正确的做法是从完整的16字节CMAC输出中提取高8字节(MS 8 Bytes,也就是数组的前8个字节)。

3. 代码修改建议

在你的scp03CalculatehostCryptogram函数中,当你得到完整的16字节CMAC结果后,只需要截取前8字节即可得到符合要求的主机密码。示例代码如下:

import java.util.Arrays;

// 假设你已经通过AES-CMAC计算得到16字节的结果
byte[] fullCmac = ...; // 你的CMAC计算输出

// 截取高8字节作为主机密码
byte[] hostCryptogram = Arrays.copyOf(fullCmac, 8);

// 后续可以将byte数组转换为你需要的String格式

总结

简单来说:AES-CMAC输出固定16字节,SCP03要求主机密码取其中的高8字节,所以你需要手动截取前8个字节来得到正确的结果。

内容的提问来源于stack exchange,提问作者vion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:27:48