提示:

这些内容仅用于DESFire EV1卡片。不带EV的DESFire卡使用CRC16而非CRC32。此外,参与CRC计算的数据也不同。

在DESFire EV1卡片中,修改密钥(ChangeKey,0xC4)命令,新密钥的CRC32,是根据密钥本身计算出来的。

而Cryptogram的CRC32,是由命令(0xC4)+密钥号(Key No.)+未加密的Cryptogram本身计算出来的。

请注意:DESFire的DES密钥长度至少为16字节。如果密钥的前8字节和后8字节完全相同,则该密钥为单DES密钥(而非2K3DES密钥)。使用单DES密钥(高低8字节相同)通过认证的,过程密钥(Session Key)只使用前8字节(RndA的前4字节+RndB的前4字节)。

为了便于理解或编写代码,也可认为单DES过程密钥长度为16字节,且前后8字节是相同的。

In case of WANTED single DES operation (leading 8 bytes of the secret key are identical to the trailing 8 bytes), only the first 8 bytes of the session key (RndA1st half + RndB1st half) are used for further cryptographic operations, the trailing 8 bytes must not be used.

《MF3 IC D40 Product Specification Revision 3.1 (April 2004)》P11。

提示:以下的例子是从网上搬运来的,里面的数据仅供参考,不一定完全正确。

使用默认的2K3DES密钥#0(密钥的值全是0x00)进行认证

*** Authenticate(KeyNo= 0, Key= 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (DES))
Sending:  <1A 00>
Response: <AF B8 90 04 7F 2D C8 D6 8B>
* RndB_enc:   B8 90 04 7F 2D C8 D6 8B
* RndB:       74 B8 43 5F CB A0 B6 75
* RndB_rot:   B8 43 5F CB A0 B6 75 74
* RndA:       92 31 34 8B 66 35 A8 AF
* RndAB:      92 31 34 8B 66 35 A8 AF B8 43 5F CB A0 B6 75 74
* RndAB_enc:  7C 84 6A 50 7B 9B 6E 68 64 BC 33 72 A3 06 A8 C1
Sending:  <AF 7C 84 6A 50 7B 9B 6E 68 64 BC 33 72 A3 06 A8 C1>
Response: <00 B7 96 DD 3F 81 15 45 F3>
* RndA_enc:   B7 96 DD 3F 81 15 45 F3
* RndA_dec:   31 34 8B 66 35 A8 AF 92
* RndA_rot:   31 34 8B 66 35 A8 AF 92
* SessKey:    92 30 34 8A 74 B8 42 5E 92 30 34 8A 74 B8 42 5E (DES)

修改2K3DES密钥,密钥号#0。(用于认证的密钥编号与欲修改的密钥编号相同)

*** ChangeKey(KeyNo= 0)
* SessKey:       B4 28 2E FA 9E B8 2C AE B4 28 2E FA 9E B8 2C AE (DES)
* SessKey IV:    00 00 00 00 00 00 00 00
* New Key:       00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 (2K3DES)
* CRC Crypto:    0x5001FFC5
* Cryptogram:    00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 C5 FF 01 50 00 00 00 00
* CryptogrEnc:   87 99 59 11 8B D7 7C 70 10 7B CD B0 C0 9C C7 DA 82 15 04 AA 1E 36 04 9C
Sending:  <C4 00 87 99 59 11 8B D7 7C 70 10 7B CD B0 C0 9C C7 DA 82 15 04 AA 1E 36 04 9C>
Response: <00>

CRC32:0x5001FFC5(或C5 FF 01 50),是由C4 00 00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80计算出的。

因为欲修改的密钥与当前认证使用的密钥相同(指密钥号相同),因此后面Cryptogram最后4字节为0x00。

修改2K3DES密钥,密钥号#1。(用于认证的密钥编号与欲修改的密钥编号不同,注意是不同!)

*** ChangeKey(KeyNo= 1)
* SessKey:       9C 70 56 82 5C 08 9E C8 9C 70 56 82 5C 08 9E C8 (DES)
* SessKey IV:    00 00 00 00 00 00 00 00
* New Key:       00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 (2K3DES)
* Cur Key:       00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (DES)
* CRC Crypto:    0xD7A73486
* CRC New Key:   0xC4EF3A3A
* Cryptogram:    00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 86 34 A7 D7 3A 3A EF C4
* CryptogrEnc:   7D 83 D3 4E FB 6C 84 98 48 E2 D6 37 AD A2 D0 87 14 36 1A E6 C4 63 14 52
Sending:  <C4 01 7D 83 D3 4E FB 6C 84 98 48 E2 D6 37 AD A2 D0 87 14 36 1A E6 C4 63 14 52>
Response: <00 1D 5C 27 97 10 86 30 8D>
CMAC:         1D 5C 27 97 10 86 30 8D

CRC32:0xD7A73486(或86 34 A7 D7),是由C4 01 00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80计算出的。

CRC32:0xC4EF3A3A(或3A 3A EF C4),是由00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80计算出的。

AES的密钥有额外一个字节的密钥版本(KeyVersion),在修改AES密钥时,计算Cryptogram的CRC32需要包括密钥版本字节。

修改AES密钥:

*** ChangeKey(KeyNo= 1)
* SessKey:       1C D3 8E BD 95 F3 1C 8A B8 7F 0A C9 C4 EB 64 C6 (AES)
* SessKey IV:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
* New Key:       00 10 20 30 40 50 60 70 80 90 A0 B0 B0 A0 90 80 (AES)
* Cur Key:       00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (AES)
* CRC Crypto:    0x84B47033
* CRC New Key:   0x1979E3BF
* Cryptogram:    00 10 20 30 40 50 60 70 80 90 A0 B0 B0 A0 90 80 10 33 70 B4 84 BF E3 79 19 00 00 00 00 00 00 00
* CryptogrEnc:   30 23 FA 06 2D 25 0A 04 35 BA E9 45 CA BE 96 5D 62 2A 47 1D 32 5D 1D 42 EA 81 44 41 CB 1A 20 C3
Sending:  <C4 01 30 23 FA 06 2D 25 0A 04 35 BA E9 45 CA BE 96 5D 62 2A 47 1D 32 5D 1D 42 EA 81 44 41 CB 1A 20 C3>
Response: <00 9B 68 30 91 50 E0 72 5E>
CMAC:         9B 68 30 91 50 E0 72 5E

CRC32:0x84B47033(或33 70 B4 84),是由C4 01 00 10 20 30 40 50 60 70 80 90 A0 B0 B0 A0 90 80 10计算出的。(0x10是密钥版本号)

CRC32: 0x1979E3BF(或BF E3 79 19),是由00 10 20 30 40 50 60 70 80 90 A0 B0 B0 A0 90 80计算出的。

下面,用VB .Net实现DESFire中的CRC32算法。

    Public Shared Function CRC32_JAMCRC(ByVal InputBytes() As Byte) As Byte()If InputBytes Is Nothing OrElse InputBytes.Length < 1 ThenReturn NothingEnd IfDim tmp1, tmp2 As UIntegerDim CRC As UInteger = &HFFFFFFFFUI  '用&H表示十六进制数,默认使用32位有符号整数(Integer)表示。后面加上UI,表示它是32位无符号整数(UInteger)Dim Polynomial As UInteger = &HEDB88320UI  '0x04C11DB7逆序Dim i, j As IntegerDim uCRC(3) As ByteFor i = 0 To InputBytes.Length - 1tmp1 = (CRC >> 8) And &HFFFFFFUItmp2 = CUInt(CRC Xor InputBytes(i)) And &HFFFor j = 0 To 7If (tmp2 And 1) = 1 Thentmp2 = (tmp2 >> 1) Xor PolynomialElsetmp2 = tmp2 >> 1End IfNextCRC = tmp1 Xor tmp2Next'DESFire在APDU中的CRC,默认是低字节在前。BitConverter的输出也是低字节在前。本函数输出的字节数组,可以直接扔到APDU里使用,无需再转换。uCRC = BitConverter.GetBytes(CRC)Return uCRCEnd Function

DESFire EV1 CRC32的原理与VB .Net实现相关推荐

  1. CRC32加密算法原理

    转载 https://bbs.21ic.com/icview-2403118-1-2.html?_dsign=e20cd6df 一.基本原理     CRC检验原理实际上就是在一个p位二进制数据序列之 ...

  2. Spy++原理初探(VB篇)

    Spy++原理初探 南京 阿珊境界 下载源代码 用API函数,就会提到句柄,像SendMessage, GetWindowText等,最常用到的参数就是句柄.啥是句柄呢?就是窗口的锅把儿,你拎着它,整 ...

  3. CRC32校验原理及实现

    CRC即循环冗余校验(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. CRC校验实用程序库:在数据存储和数据通 ...

  4. CRC32校验算法原理及计算说明

    本文主要介绍如何使用CRC32校验算法计算得出FCS(Frame Check Sequence帧检验序列). 参考: 1.CRC32加密算法原理 2.CRC多项式对应代码 一.CRC基本原理(Cycl ...

  5. 多线程 分段 爆破crc32 C#C/C++ (一)

    文章目录 前言 一.概念确认 二.分段核心思路设计 三.线程传参 四.c版源码 五.c#版源码 五... 前言 最近闲暇之余在解CTf时,遇到了压缩包内crc32的问题(较短的明文可以通过爆破crc值 ...

  6. MIFARE DESFire卡介绍

    原文地址::http://www.nxp.com/zh-Hans/products/identification-and-security/smart-card-ics/mifare-ics/mifa ...

  7. CTF-MISC文件隐写总结(图片,音频,视频,压缩包等文件)

    前置知识 file 命令根据文件头,识别文件类型,如果文件头前边有数据就识别不出来了 strings 输出文件中的可打印字符 可以发现一些提示信息或者特殊编码的信息 可以配合-o参数获取所有的ASCI ...

  8. 多种非接触卡 ATQA 字节说明

    原文地址 13.56 MHz RFID Software An Open Source implementation of an NFC stack, and various related util ...

  9. NFC读写芯片15693协议CLRC663国产替代DP1363F兼容详细对比资料

    nfc功能是什么意思?"NFC是近场通信.近场通信,也叫近距离无线通信,使用了NFC技术的设备可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别及互连互通技术整合演变而来,通过在单一芯 ...

最新文章

  1. 从深度学习到深度森林方法(Python)
  2. 正则表达式中问号等特殊字符的转义(转)
  3. B站面试官炫耀身价过亿,贬低北邮应试者引热议!不知北邮毕业的B站创始人作何感想?
  4. 如何模拟将CPU、IO打满?
  5. GWT更改元素样式属性
  6. python3.x版本的保留字总数是多少_Python3.6.5版本的保留字总数是:()-智慧树大数据分析的python基础章节答案...
  7. php7.0 百度百科,PHP 7.0.10正式发布
  8. 我的python学习笔记全集_我的python学习笔记
  9. SAP License:FI-CO集成
  10. WPF学习笔记(5):两个DataGrid的滚动条实现同步滚动(转)
  11. Redis更新数据的时候如何不重置过期时间
  12. 分布式中间件实践之路
  13. 用php的定界符EOT需要注意的地方
  14. 制造上云 佛山南海携手阿里云建创新中心
  15. maven几个plugins
  16. 你还记得当年高考时的样子吗?
  17. 外贸网站到底选什么购物车网店系统最好
  18. 解决——使用驱动器X:中的光盘之前需要将其格式化问题
  19. springboot+thymeleaf+bootstrap+mybatis-Plus+mysql 情侣空间网站源代码
  20. Win7升为Win10以及win7系统的重装

热门文章

  1. 视频教程-ReactNative初级到项目实战-ReactNative
  2. 计算机审计实训遇到的问题及解决方法,计算机审计实训报告
  3. mysql 字段变更记录_如何记录数据表信息的变更
  4. Tableau(5):符号地图、仪表盘、自定义显示
  5. js将excel转为html,js中表格转为excel文件如何实现多sheet形式
  6. 智能硬件语音交互流程分析
  7. 【职业规划】了解自己~
  8. 【iOS开发-112】UIDynamic物理模拟介绍,如重力行为、碰撞行为、碰撞行为以及其他
  9. 韭菜投资ABC:买下整个A股或者美股的收益有多少?
  10. 996 icu 不算什么?生活在继续