分类: 嵌入式
2017-03-02 18:01:18
转载:http://blog.sina.com.cn/s/blog_9ed067ad01012db9.html
Mifare DESFire(MF3 IC D40/D41,本文以D40为例)遵守14443 TypeA协议,卡内的数据以文件形式存储,所以有人认为它是准CPU卡,主要用于安全性要求较高的非接触式领域。
与普通MF1 S50不同,DESFire的数据传输速率不仅支持最基本的106Kbps,还支持212Kbps和424Kbps;其数据传送的加密方法也不再使用已经被破解的Crypto1加密流,而是使用更为安全的DES/3DES、AES加密,至少DES/3DES和AES已经经过了多年的公开检验,至今还没有被破解。
DESFire的全球唯一序列号是7字节,支持ISO14443-4和ISO7816的部分协议。7字节的序列号要使用两个防冲突循环才能读出,第一轮防冲突循环卡片返回层级代码0x88, UID的前3个字节SN0-SN2和校验码BCC0,第二轮防冲突循环返回UID的后4个字节SN3-SN6和校验码BCC1,SN0为制造商的ID号,NXP产品固定为16进制的04H.
DESFire有4K字节的非易失存储空间,典型的写时间为2ms(1ms擦除,1ms编程)。存储空间的组织采用柔性文件系统,D40卡上可同时最多支持28种应用,每种应用用一个3字节的应用标识符(AID)表示,每种应用可以设置序号为0-13的最多14组不同的密码,每种应用下可建立最多16个文件.
卡片支持5种不同的文件类型,每种类型使用一个字节的类型编码来表示。文件类型及其编码如下:
文件类型 | 类型编码 |
标准数据文件 | 0x00 |
备份数据文件 | 0x01 |
带有备份的值文件 | 0x02 |
带有备份的线性记录文 | 0x03 |
带有备份的循环记录文件 | 0x04 |
每种应用与读写器之间的通讯加密等级根据安全性不同分为3类,使用一个字节的通讯设置码来表示。通讯设置码的各个bit代表的意义如下表所示:
通讯模式 |
Bit7-bit2 |
Bit1 |
Bit0 |
明文通讯 |
RFU=0 |
忽略 |
0 |
具有DES/3DES MAC校验的明文通讯 |
RFU=0 |
0 |
1 |
完全DES/3DES密文通讯 |
RFU=0 |
1 |
1 |
明文模式最简单,就是直接传送没有加密的真值,一旦被截获,黑客看到的就是真实信息;
带有MAC校验的明文传输也好不到哪里去,它是把要传送的明文用CBC模式进行DES/3DES加密,把最后一步的8字节加密输出结果中的前4字节称为MAC校验,加在要传送的明文后面,前面的明文还是明文,只不过加了个校验防止出错而已;
只有第三种完全DES/3DES密文通讯才对得起“DESFire”这个名字,这是真正的加密通讯。所有要传送的密文先用CRC16进行校验,然后明文连同CRC16校验作为一个整体使用CBC模式的DES/3DES加密,传送的是加密后的密文。黑客即使截获了也看不懂,前提是不知道DES密码。
前面叙述时经常用DES/3DES这个组合,那到底是DES还是3DES呢,二者的运算量和加密强度可是有天壤之别啊!这一点DESFire卡片采用了自动识别的方法。DES和3DES密钥的长度都是16字节,如果前8字节与后8字节相同,则自动被作为DES运算;反之,如果前8字节与后8字节不同,则自动被作为3DES运算。
DES密钥举例:0x00 11 22 33 44 55 66 77 00 11 22 33 44 55 66 77
0x00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3DES密钥举例:0x00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
0x00 11 22 33 44 55 66 77 00 00 00 00 00 00 01 00
0x00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00
D40卡片的默认出厂设置为密钥全0,单DES操作。
DESFire卡片可以为应用中的文件设置不同的读写权限,读写权限的意思就是读或写文件时是否需要验证密码,以及验证哪一组密码。读写权限使用2个字节的编码来表示,2个字节共16个bit,每4个bit表示一种权限类型:
15 12 11 8 7 4 3 0
读文件 要验证的密码 |
写文件 要验证的密码 |
读和写文件 要验证的密码 |
修改文件的读写权限 要验证的密码 |
前面说了,每种应用可以有编号为0-13的最多14组不同的密码,而4位二进制数可以表示0-15共16种组合。当4位权限码的值为0-13时,表示执行相应的读写操作要验证权限码的值指向的一组密码;当权限码的值为14时,表示不用验证任何密码可直接读写;权限码的值为15时表示冻结,就是不论什么条件也不让读写了。
DESFire的卡片命令可以分为6大类:
(1)ISO14443-3 命令
(2)ISO14443-4 命令
(3)安全相关命令
(4)卡片级命令
(5)应用层命令
(6)数据操作命令
DES/3DES的基本运算包括加密和解密,Desfir卡片规定,当读写器(PCD)与卡片(PICC)进行DES/3DES运算时,卡片总是进行加密运算,与之对应,读写器总是进行解密运算。DES密钥有16个字节,如果前8个字节与后8个字节相同,则进行DES运算,反之如果前8个字节和后8个字节不同,则进行3DES运算。如下表所示:
使用密钥 |
PICC |
PCD |
KEY1:3DES密钥的前8个字节 |
加密 |
解密 |
KEY2:3DES密钥的后8个字节 |
解密 |
加密 |
KEY3:3DES密钥的前8个字节 |
加密 |
解密 |
DES/3DES运算每次操作8字节,如果数据不足8字节,必须填充为8字节,填充的数据通常是00,如果正好要进行DES运算的数据是“00 00 00”(比如“读取所有数据”命令),则填充一个0x80,后面再填充00。
所有的DES/3DES操作使用密码块链接模式(CBC),即上一次DES运算的结果作为下一次运算的初始向量。发送数据使用发送CBC模式,接收数据使用接收CBC模式。第一次运算的初始向量规定为8字节的00.
以下描述3次握手认证和段密码产生的过程及实例,假设卡片密码为16个00:
第一步:读写器作为发起认证的主导方,向卡片发送认证(Authenticate)命令,并携带一个表示密码序号的参数(卡片上每种应用可以最多有14组不同的密码,其序号为0-D)。如果选定的应用标识符AID为0,那么认证将指向卡片的主密码(卡片密钥),在此情况下,密码序号必须为0。如果AID不为0,则认证的是某一应用的密码。卡片进入磁场上电复位后将默认选中AID为0。也就是说卡片复位的首次密码认证总是指向卡片主密码。如果卡片上不存在指定的密码组号,卡片将返回一个错误码。
第二步:卡片用读写器指定的密码加密一组8字节的随机数RndB,例如RndB=98 E4 EE 2E 8B 4B F7 B1,加密方法使用DES/3DES,其结果用ek(RndB)表示,此处ek(RndB)=61 58 F4 51 8A 25 9B 00,并把ek(RndB)返回给读写器。
第三步:读写器用待认证的密码16个00,对收到的ek(RndB)进行DES/3DES解密从而得到RndB=98 E4 EE 2E 8B 4B F7 B1。接下来读写器对RndB进行8位闭合左循环,从而将第一个字节移到了最后一个字节的位置,结果记为RndB’,RndB’=E4 EE 2E 8B 4B F7 B1 98。然后读写器自己产生一个8字节的随机数RndA,例如RndA=00 11 22 33 44 55 66 77,并与RndB’连接起来组成RndA+RndB’=00 11 22 33 44 55 66 77 E4 EE 2E 8B 4B F7 B1 98共16字节,使用CBC模式的DES/3DES解密运算,得到的结果称为dk(RndA+RndB’)=74 F4 AE 77 7A A4 31 E8 4B 18 BA 8F 74 CF 80 63发送给卡片。
第四步:卡片收到16字节dk(RndA+RndB’)后执行DES/3DES加密运算,得到结果RndA+RndB’。卡片首先将自己原来的RndB大循环左移8位,看结果是否等于RndB’,如果不相等,卡片将停止认证过程,并回送一个错误码。如果相等,证明卡片使用的密码和读写器使用的密码一致,卡片将获得的RndA也大循环左移8位得到RndA’=11 22 33 44 55 66 77 00,然后对RndA’进行DES/3DES加密运算,得到的结果称为ek(RndA’)=F1 81 F7 32 6D CD 86 A6回送给读写器。
第五步:读写器收到ek(RndA’)后执行DES/3DES解密从而得到Rnd A’,并把自己之前产生的RndA大循环左移8位,得到的结果与Rnd A’比较,如果不相等,读写器将退出认证过程并可将卡片休眠。
第六步:卡片将当前的应用设置为通过认证状态,如果AID=0,则将卡片本身设置为通过认证状态。
第七步:如果双方所有的比较都成功,通过组合RndA和RndB得到一个16字节的段密码,组合的方法如下:
段密码=RndA第一部分+RndB第一部分+ RndA第二部分+RndB第二部分
对于本文中的例子,产生的段密码为
00 11 22 33 98 E4 EE 2E 44 55 66 77 8B 4B F7 B1
之所以采取这种组合方法产生段密码是为了避免恶意的读写器通过将RndA=RndB而将3DES运算强行转化为DES运算。如果之后的数据传输确实想使用单DES操作(使段密码的前8字节与后8字节相等),应使用前8个字节,即RndA第一部分+RndB第一部分,而不能使用后8个字节。
得到16字节的段密码后,3次相互握手认证完成。如果之后的通讯是DES/3DES加密传输,则使用刚产生的16字节段密码作为临时的DES密钥。