天天看点

射频识别技术漫谈(19)——Desfire的3次握手认证和段密码生成

并生成临时的通讯密钥在通讯技术中的应用非常普遍,mifare

desfire也使用了这种成熟的认证加密方法。desfire在卡片数据传输前使用des或3des进行3次握手认证,认证成功一方面表明卡片和读写器双方是可以相互信任的,同时为双方之后的数据传送提供了一组临时使用的段密码进行加密保护。

    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密钥。

继续阅读