DESFire EV1修改默认TDES密钥为AES密钥

空白DESFire EV1 8K卡,默认PICC主密钥为16个0x00。

APDU采用7816-4形式。DESFire Native APDU和7816-4 APDU之间的关系,请参考以下链接。

DESFire的7816-4 APDU封装及查看卡片版本信息_robur的博客-CSDN博客在成功进入ISO 14443-4后,DESFire卡片收到的第一个APDU类型,决定了卡片后续使用的APDU类型。如果收到的是符合7816-4的APDU,则卡片后续的命令都使用7816-4。DESFire卡支持7816-4规定的如下INS:A4(SELECT)D0(Read Binary)D6(Update Binary)还支持经过封装的原生DESFire APDU。CLAINSP1P2LcDataLe90DESFirhttps://blog.csdn.net/robur/article/details/122417165

0. DESFire卡上电后默认选择AID 0x00,也就是选择卡片级别(PICC level)。修改PICC主密钥,不需要再执行SelectApplication(0x5A,选择应用)命令。

1. 读卡器发送Authenticate(0x0A,认证)命令,卡片返回ek(RndB),状态字0xAF

Rdr: 90 0A 00 00 01 00 00
Tag: 26 E1 33 1B A0 03 F6 C0 [91 AF]

ek()表示DES加密(encipher),卡片永远执行DES加密操作。

2. 读卡器进行运算:

解密得到RndB = DB926FFE5066E1FE

读卡器生成RndA = 0102030405060708

rot(RndB) = RndB' = 926FFE5066E1FEDB(rot()表示执行8位闭合左循环,即最高字节变为最低字节)

dk(RndA + RndB') = CEAD373DB80EABF8 E5F0066DE13C575E

dk()表示DES解密(decipher),读卡器永远执行DES解密操作。

3. 读卡器发送响应和它自己的挑战,卡片应答ek(RndA'),状态字0x00

Rdr: 90 AF 00 00 10 CE AD 37 3D B8 0E AB F8 E5 F0 06 6D E1 3C 57 5E 00
Tag: FB 79 6C 9A AF BF 71 D3 [91 00]

卡片应答状态字0x00,表示卡片认证读卡器成功(卡片认为读卡器是合法的)。

命令0xAF对应卡片上一个状态字0xAF,0xAF表示Additional Frame(额外的数据帧)。这些额外的帧也是认证命令(0x0A)的一部分。

4. 读卡器进行运算:

解密后的RndA' = 0203040506070801

rot(RndA) = RndA',三次握手认证成功(也是读卡器认证卡片成功,读卡器认为卡片是合法的)。

生成过程密钥(Session Key):01020304DB926FFE  050607085066E1FE

实际使用的过程密钥:01020304DB926FFE(16字节长度表达形式为:01020304DB926FFE  01020304DB926FFE,前后8字节相同)

请注意:

因为默认TDES密钥的前后8字节相同,所以它实际上是一个单DES密钥。对于使用单DES密钥通过的认证,过程密钥也必须是单DES密钥。按照过程密钥生成算法得到的后8字节密钥不予使用,仅使用前(高)8字节。(如果需要16字节长度的过程密钥,就把前8字节复制一遍。)

5. 确定欲更改的密钥编号、新密钥的值和版本

密钥编号:0x80。实际上的密钥编号是0x00(PICC主密钥),但因用于AES密钥,密钥编号的前2个bit必须为10b,1000 0000 = 0x80。

新密钥的值:0000000000000000 0000000000000000(16字节0x00)

新密钥的版本(只有AES密钥有额外1字节的版本):0x00

6. 读卡器为新密钥计算CRC,并组成Cryptogram

CRC的算法取决于先前通过的认证方式(TDES/AES)。参与CRC运算的元素取决于先前通过的认证方式,以及认证的密钥与欲修改的密钥是否相同。

本例中认证为TDES,认证使用的密钥与欲修改的密钥相同。因此算法使用CRC16,参与运算的元素为:

新密钥的值+密钥版本,一共是17字节0x00。

使用DESFire专用的CRC16算法,得到结果为0x75 45。(算法参考以下链接)

VB.NET实现DESFire ISO14443A CRC16_robur的博客-CSDN博客Public Shared Function CRC_ISO14443A(ByVal InputBytes() As Byte) As UShort If InputBytes Is Nothing OrElse InputBytes.Length < 1 Then Return &H0 End If Dim Data As UShort Dim CRC As UShort = &H63...https://blog.csdn.net/robur/article/details/122589564Cryptogram是包含了密钥+[密钥版本]+CRC+[填充字节]的字节序列。其中密钥和CRC是必须的。额外的密钥版本只有AES密钥需要 (本例中为00)。长度不够时需要填充字节(本例中为5字节)。

Cryptogram = 00000000000000000000000000000000 00 7545 0000000000

7. 读卡器解密Cryptogram

使用先前认证生成的过程密钥(01020304DB926FFE),对Cryptogram进行DES-CBC解密操作(CBC发送模式,IV = 全零)。关于CBC发送模式和接收模式,参考以下链接:

DESFire中的CBC发送模式与CBC接收模式_robur的博客-CSDN博客DESFire中对于数据加密,有两种模式:1. CBC发送模式(CBC Send Mode);2. CBC接收模式(CBC Receive Mode)。但是厂家文档中对这两种模式的具体操作没有进行详细的解释。笔者通过查阅多个项目的源代码,现详细说明如下:一、CBC发送模式1. (输入数据的)第一个数据块,与IV进行异或;2. 异或的结果进行ECB密码学运算(加密/解密),得到第一个数据块的输出;3. 复制第一个数据块的输出到IV;4. 第二个数据块,与IV进行异或(此https://blog.csdn.net/robur/article/details/124045496

注:读卡器始终执行DES解密,卡片始终执行DES加密。

dk(Cryptogram) = 003F0CCD3B65F44F 81FFDF2E6C9FC2D6 9E7E5D279D2D5B94

8. 读卡器发送ChangeKey(0xC4,修改密钥)命令,卡片应答状态字0x00,修改密钥成功

Rdr: 90 C4 00 00 19 80 00 3F 0C CD 3B 65 F4 4F 81 FF DF 2E 6C 9F C2 D6 9E 7E 5D 27 9D 2D 5B 94 00
Tag: [91 00]

欲修改的密钥编号并不包括在Cryptogram内,它是一个独立的参数,本例中为0x80。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值