首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mifare灭火包装模式:如何计算CMAC?

Mifare灭火包装模式:如何计算CMAC?
EN

Stack Overflow用户
提问于 2016-11-14 07:21:08
回答 1查看 2K关注 0票数 3

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

成功身份验证后,我有以下会话密钥:

代码语言:javascript
复制
Session Key: 7CCEBF73356F21C9191E87472F9D0EA2

然后,当我发送一个GetKeyVersion命令时,card返回下面的CMAC,我正在验证它:

代码语言:javascript
复制
<< 90 64 00 00 01 00 00
>> 00 3376289145DA8C27 9100

我根据"NIST专刊800-38B“实现了CMAC算法,并确保了算法的正确性。但我不知道必须使用哪一部分命令和响应APDU来计算CMAC。

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

EN

回答 1

Stack Overflow用户

发布于 2017-12-15 19:17:16

对我的英语来说,很糟糕:)但这不是我的母语。我是俄国人。

首先检查数组的MSB (7位),然后将它移到左边.然后异或,如果MSB 7位是== 1;或者先保存MSB位数组,然后在移位后将此位放在array15的末尾(LSB位)。

只是证明它在这里:https://www.nxp.com/docs/en/application-note/AN10922.pdf

试着这样做:

零<- 00 00 00 SessionKey <- 00 01 02 03 E3 27 64 0C 0C 0D 0E 0F 5C 5D B9 D5 数据<- 6 F 80 00 00 00

首先,你必须用SesionKey加密16个字节(零);

代码语言:javascript
复制
enc_aes_128_ecb(Zeros);

你得到了EncryptedData。

EncryptedData <- 3D 08 A2 49 D9 71 58 EA 75 73 18 F2 FA 6A 27 AC

检查EncryptedData == 1的第7位MSB?转I为真;

代码语言:javascript
复制
 bool i = false;
  if (EncryptedData[0] & 0x80){
    i = true;
  }

然后将所有EncryptedData转换为1位<<。

代码语言:javascript
复制
ShiftLeft(EncryptedData,16);

现在,当我使用== true - XOR时,最后一个字节15是0x87。

代码语言:javascript
复制
if (i){
    ShiftedEncryptedData[15] ^= 0x87;
  }

7A 11 44 93 B2 E2 B1 D4 EA E6 31 E5 F4 D4 4F 58

将其保存为KEY_1。

试试ShiftedEncryptedData == 1的第7位MSB吗?

代码语言:javascript
复制
 i = false;
  if (ShiftedEncryptedData[0] & 0x80){
    i = true;
  }

然后将所有ShiftedEncryptedData转换为1位<<。

代码语言:javascript
复制
ShiftLeft(ShiftedEncryptedData,16);

现在,当我使用== true - XOR时,最后一个字节15是0x87。

代码语言:javascript
复制
if (i){
   ShiftedEncryptedData[15] ^= 0x87;
}

F4 22 89 27 65 C5 63 A9 D5 CC 63 CB E9 A8 9E B0

将其保存为KEY_2。

现在我们拿我们的数据(6F 800000000000000000000000000000000000)

就像迈克尔说的那样,0x800x00.

使用KEY_2的异或数据- if命令被填充,或者KEY_1如果没有。如果我们有更多的16字节(例如32字节),你必须只有最后16个字节。

然后加密:

代码语言:javascript
复制
enc_aes_128_ecb(Data);

现在你有了一个CMAC。

CD C0 52 62 6D F6 60 CA 9B C1 09 FF EF 64 1A E3

零<- 00 00 00 SessionKey <- 00 01 02 03 E3 27 64 0C 0C 0D 0E 0F 5C 5D B9 D5 Key_1 <- 7A 11 44 93 B2 E2 B1 D4 E6 31 E5 F4 D4 4F 58 Key_2 <- F4 22 89 27 65 C5 63 A9 D5 CC 63 CB E9 A8 9E B0 数据<- 6 F 80 00 00 00 CMAC <- CD C0 52 62 6D F6 60 CA 9B C1 09 FF EF 64 1A E3

C/C++函数:

代码语言:javascript
复制
void ShiftLeft(byte *data, byte dataLen){
  for (int n = 0; n < dataLen - 1; n++) {
   data[n] = ((data[n] << 1) | ((data[n+1] >> 7)&0x01));
  }
  data[dataLen - 1] <<= 1;
}   

祝你今天愉快:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40583676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档