如何解密从Mifare Desfire EV1发送的第一条消息

如何解密从Mifare Desfire EV1发送的第一条消息,第1张

如何解密从Mifare Desfire EV1发送的第一条消息

认证后,IV重置为全零。使用AES身份验证时,您必须为每个后续命令计算CMAC(即使CMAC实际上未附加到该命令之后)。因此,针对您的命令的CMAC计算将导致正确的IV初始化,以对响应进行解码。即,该命令的CMAC等于解密响应的IV。同样,对于所有其他命令,IV是来自先前加密/
CMAC的最后一个密码块。


更新:

如何计算CMAC填充XOR值

  • 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
    使用会话密钥(使用零的IV)加密一个零块()。->
    x[0..15]
  • x[0..15]
    向左旋转一位。->
    rx[0..15]
  • 如果最后一位(中的位0
    rx[15]
    )为1:
    rx[15]
    与或
    0x86
  • 储存
    rx[0..15]
    crc_k1[0..15]
  • rx[0..15]
    向左旋转一位。->
    rrx[0..15]
  • 如果最后一位(中的位0
    rrx[15]
    )为1:
    rrx[15]
    与或
    0x86
  • 储存
    rrx[0..15]
    crc_k2[0..15]

如何计算CMAC

  • 使用
    0x80 0x00 0x00 ...
    密码的块大小填充命令(AES为16字节)。如果命令长度与块大小的倍数匹配,则不添加填充。
  • 对于您的命令(
    0x51
    ),它看起来像:
    0x51 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  • 如果添加了填充,请使用来对填充命令的最后16个字节进行xor运算
    crc_k2[0..15]
  • 如果未添加填充,请使用来对命令的最后16个字节进行xor运算
    crc_k1[0..15]
  • enc(IV xor datablock)
    用会话密钥加密(在发送模式下,即前一个块的密文为新的IV)结果。
  • 最后一块的密文是CMAC和新的IV。

更新2:

如何将位向量向左旋转一位

public void rotateLeft(byte[] data) {    byte t = (byte)((data[0] >>> 7) & 0x001);    for (int i = 0; i < (data.length - 1); ++i) {        data[i] = (byte)(((data[i] << 1) & 0x0FE) | ((data[i + 1] >>> 7) & 0x001));    }    data[data.length - 1] = (byte)(((data[data.length - 1] << 1) & 0x0FE) | t);}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5561524.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存