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

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

  1. 射频识别技术漫谈(10)——识别号的格式变化【worldsing笔记】

    从事RDID行业的朋友经常会遇到这样的情况,同一张ID卡,在不同厂家生产的读卡器上读出的识别号完全不一样,有时甚至差之千里.ID卡的识别号一般是在出厂时被固化在卡片的ROM里,本身是不会改变的,问题出 ...

  2. 射频识别技术漫谈(18)——Mifare Desfire

    Mifare  DESFire(MF3 IC D40/D41,本文以D40为例)遵守14443 TypeA协议,卡内的数据以文件形式存储,所以有人认为它是准CPU卡,主要用于安全性要求较高的非接触式领 ...

  3. 射频识别技术漫谈(1)——概念、分类

    现代社会智能卡已经渗透到生活的方方面面,公交卡.考勤卡.身份证.手机卡等等数不胜数.    智能卡按使用时是否和读卡器接触可分为接触式智能卡和非接触式智能卡,接触式智能卡上有6-8个触点,使用时插在卡 ...

  4. 射频识别技术漫谈(12)——三次相互认证【worldsing笔记】

    射频识别系统中由于卡片和读写器并不是固定连接为一个不可分割的整体,二者在进行数据通讯前如何确信对方的合法身份就变得非常重要.根据安全级别的要求不同,有的系统不需认证对方的身份,例如大多数的TTF模式的 ...

  5. 射频识别技术漫谈(6)——通讯协议概述【worldsing笔记】

    通讯协议是通讯的双方或多方在交流时遵守的规矩,包括谁先发起通讯,先交流什么,后交流什么,一方如何问,另一方如何答等.在这里通迅的双方指的是读写器和卡片. 首先是谁先发起通讯,很显然有两种,读写器先发言 ...

  6. 射频识别技术漫谈(4)——数据编码【worldsing 笔记】

    前已述及,射频识别技术中的调制方法一般使用调幅(AM),也就是将有用信号调制在载波的幅度上传送出去.这里的"有用信号"指用高低电平表示的数据"0"或" ...

  7. 射频识别技术漫谈(3)——能量、调制【worldsing 笔记】

    无源和免接触是非接触式IC卡相对于接触式IC卡的两大特点.无源是指卡片上没有电源,免接触是指对卡片的读写操作不必和读写器接触.非接触式智能卡也是IC卡,而卡上的IC即集成电路工作时肯定是需要电源的,卡 ...

  8. 射频识别技术漫谈(25)——Felica简介

    Felica是SONY公司开发的射频识别技术,该技术使用的载波频率与ISO14443A和ISO14443B一样,都是13.56MHz,所以有人把它称为ISO14443C,但SONY并没有正式接受这样的 ...

  9. 射频识别技术漫谈(23)——ISO15693的载波、调制与编码

    射频识别技术中的通讯大多是主从式,主动方一般是读写器,被动方称为“卡片”或“标签”.到底是叫“卡片”还是“标签”,好像也没有严格的区分.习惯上可以从以下4个方面界定:一是形状,卡片通常体积较大,更像“ ...

随机推荐

  1. JavaScript之JS的执行环境和作用域

    一.执行环境是JavaScript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为,每个执行环境都有一个与之关联的变量对象(variable object),环境 ...

  2. CentOS6.3下安装配置SVN(Subversion)

    #检查是否安装了低版本的SVN [root@localhost ~]# rpm -qa subversion subversion--.el6.x86_64 #卸载旧版本SVN [root@local ...

  3. C++_知识点_指针类型转换

    #include <iostream> using namespace std; int main(){ ] = {, , , , , , , , , }; int* p = (int*) ...

  4. intellj idea 如何设置类头注释和方法注释

    intellj idea 如何设置类头注释和方法注释           intellj idea的强大之处就不多说了,相信每个用过它的人都会体会到,但是我们也会被他的复杂搞的晕头转向,尤其刚从ecl ...

  5. The type javax.servlet.http.HttpServletRequest cannot be resolved.

    The type javax.servlet.http.HttpServletRequest cannot be resolved. It is indirectly referenced from ...

  6. SDOI2008 Sandy的卡片( 后缀数组 )

    求出后缀数组, 然后二分答案, 对height数组分组检验答案. 时间复杂度O(|S| log|S|) ------------------------------------------------ ...

  7. poj 1321 棋盘问题 递归运算

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19935   Accepted: 9933 Description ...

  8. uva424 高精度计算

    题意是计算各长整数的和,最多输入100个数,每个数都是正整数且位数不超过100. 很明显100位的数用数组存会方便许多,然后设置两个整型数组,一个存进位,一个存结果.为了对齐进行运算,我将所有的数先逆 ...

  9. Android 中Java和JavaScript交互入门

    如何实现JavaScript 和java 交互 实现Java和js交互十分便捷.通常只需要以下几步. WebView开启JavaScript脚本执行 WebView设置供JavaScript调用的交互 ...

  10. spoj 1557 GSS3 - Can you answer these queries III 线段树

    题目链接 给出n个数, 2种操作, 一种是将第x个数改为y, 第二种是询问区间[x,y]内的最大连续子区间. 开4个数组, 一个是区间和, 一个是区间最大值, 一个是后缀的最大值, 一个是前缀的最大值 ...