gpt4 book ai didi

Mifare Desfire 包裹模式 : How to calculate CMAC?

转载 作者:行者123 更新时间:2023-12-02 01:20:12 24 4
gpt4 key购买 nike

当使用 Desfire 原生包装的 APDU 与卡通信时,必须使用命令和响应的哪些部分来计算 CMAC?

身份验证成功后,我有以下 session key :

Session Key: 7CCEBF73356F21C9191E87472F9D0EA2

然后当我发送 GetKeyVersion 命令时,卡返回我正在尝试验证的以下 CMAC:

<< 90 64 00 00 01 00 00
>> 00 3376289145DA8C27 9100

我已经根据“NIST special publication 800-38B”实现了 CMAC 算法并确保它是正确的。但我不知道必须使用命令和响应 APDU 的哪些部分来计算 CMAC。

我用的是TDES,所以MAC是8字节。

最佳答案

过去几天我一直在研究完全相同的问题,我想我至少可以给你一些建议。让一切“就这样”需要一些时间,而且在某些情况下,NXP 的文档(假设您有权访问)有点难以解释。

因此,正如您可能知道的那样,您需要在传输和接收时计算 CMAC(并更新您的 init vec)。每次计算时都需要保存CMAC作为下一次加密操作(无论是CMAC还是加密等)的init vec。

为您的示例计算 CMAC 时,输入 CMAC 算法的数据是 INS 字节 (0x64) 和命令数据 (0x00)。当然,这将按照 CMAC 的规定进行填充等。但是请注意,您计算整个 APDU 包装(即 90 64 00 00 01 00 00)的 CMAC,仅使用 INS 字节和数据负载。

在接收时,您需要获取数据 (0x00) 和第二个状态字节(也是 0x00)并计算其上的 CMAC。在这个例子中它并不重要,但这里的顺序很重要。您使用响应主体(不包括 CMAC),然后使用 SW2。

请注意,实际上仅发送了一半的 CMAC - CMAC 应产生 16 个字节,卡发送前 8 个字节。

还有其他一些事情阻碍了我,包括:

  • 我计算的 session key 不正确 - 如果结果没有如您预期的那样,值得仔细检查一下
  • 我解释文档说整个 APDU 结构用于计算 CMAC(很难以其他方式阅读它们 tbh)

我仍在努力正确计算写入数据命令的响应。命令成功,但我无法验证 CMAC。我确实知道写入数据没有用 CMAC 填充填充,而只是用零填充 - 还不确定我还错过了什么。

最后,这是一个与我的日志中的卡片通信的真实示例:

  1. 身份验证完成 (AES), session key 确定为 F92E48F9A6C34722A90EA29CFA0C3D12; init vec 为零

  2. 我将发送 Get Key Version 命令(如您的示例所示),因此我计算 6400 的 CMAC 并获得 1200551CA7E2F49514A1324B7E3428F1(现在我的 init vec 用于下一次计算)

  3. 发送90640000010000到卡片,收到00C929939C467434A8(状态为9100)。

  4. 00 00 上计算 CMAC 并得到 C929939C467434A8A29AB2C40B977B83(并为下一次计算更新 init vec)

  5. 我们第 4 步中的 CMAC 的前半部分与第 3 步中从卡接收到的 8 个字节相匹配

关于Mifare Desfire 包裹模式 : How to calculate CMAC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40583676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com