射频识别技术漫谈(19)——Desfire的3次握手认证和段密码生成
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次握手认证和段密码生成的更多相关文章
- 射频识别技术漫谈(10)——识别号的格式变化【worldsing笔记】
从事RDID行业的朋友经常会遇到这样的情况,同一张ID卡,在不同厂家生产的读卡器上读出的识别号完全不一样,有时甚至差之千里.ID卡的识别号一般是在出厂时被固化在卡片的ROM里,本身是不会改变的,问题出 ...
- 射频识别技术漫谈(18)——Mifare Desfire
Mifare DESFire(MF3 IC D40/D41,本文以D40为例)遵守14443 TypeA协议,卡内的数据以文件形式存储,所以有人认为它是准CPU卡,主要用于安全性要求较高的非接触式领 ...
- 射频识别技术漫谈(1)——概念、分类
现代社会智能卡已经渗透到生活的方方面面,公交卡.考勤卡.身份证.手机卡等等数不胜数. 智能卡按使用时是否和读卡器接触可分为接触式智能卡和非接触式智能卡,接触式智能卡上有6-8个触点,使用时插在卡 ...
- 射频识别技术漫谈(12)——三次相互认证【worldsing笔记】
射频识别系统中由于卡片和读写器并不是固定连接为一个不可分割的整体,二者在进行数据通讯前如何确信对方的合法身份就变得非常重要.根据安全级别的要求不同,有的系统不需认证对方的身份,例如大多数的TTF模式的 ...
- 射频识别技术漫谈(6)——通讯协议概述【worldsing笔记】
通讯协议是通讯的双方或多方在交流时遵守的规矩,包括谁先发起通讯,先交流什么,后交流什么,一方如何问,另一方如何答等.在这里通迅的双方指的是读写器和卡片. 首先是谁先发起通讯,很显然有两种,读写器先发言 ...
- 射频识别技术漫谈(4)——数据编码【worldsing 笔记】
前已述及,射频识别技术中的调制方法一般使用调幅(AM),也就是将有用信号调制在载波的幅度上传送出去.这里的"有用信号"指用高低电平表示的数据"0"或" ...
- 射频识别技术漫谈(3)——能量、调制【worldsing 笔记】
无源和免接触是非接触式IC卡相对于接触式IC卡的两大特点.无源是指卡片上没有电源,免接触是指对卡片的读写操作不必和读写器接触.非接触式智能卡也是IC卡,而卡上的IC即集成电路工作时肯定是需要电源的,卡 ...
- 射频识别技术漫谈(25)——Felica简介
Felica是SONY公司开发的射频识别技术,该技术使用的载波频率与ISO14443A和ISO14443B一样,都是13.56MHz,所以有人把它称为ISO14443C,但SONY并没有正式接受这样的 ...
- 射频识别技术漫谈(23)——ISO15693的载波、调制与编码
射频识别技术中的通讯大多是主从式,主动方一般是读写器,被动方称为“卡片”或“标签”.到底是叫“卡片”还是“标签”,好像也没有严格的区分.习惯上可以从以下4个方面界定:一是形状,卡片通常体积较大,更像“ ...
随机推荐
- js 全局函数
全局函数与内置对象的属性或方法不是一个概念. 全局函数它不属于任何一个内置对象. JS中有14个全局函数 函数 描述 decodeURI() 解码某个编码的 URI. decodeURICompone ...
- jquery ajax 在ie7不能正常使用
jquery ajax结构不规范到时再ie8以下的用户不能正常使用.比如[1,2,].{1,2,},结构内部的最后不能有“,”.
- 数据持久化------Archiving(归档,解档)
其中TRPerson为自定义的继承自NSObject的类的子类 其中有两个属性,name 和 age .h文件 #import @interface TRPerson : NSObject<& ...
- 用原生JS写移动动画案例及实际应用
js很强大 相信很多人都知道,那么它有哪些强大之处呢?有兴趣的人可以去查查,这里就不赘述了,因为不在本片文章讨论的范围. 我们要讲的是怎么用原生JS写移动动画?我们先举一个最简单的动画例子,很多网站的 ...
- vue.js自定义指令入门
Vue.js 允许你注册自定义指令,实质上是让你教 Vue 一些新技巧:怎样将数据的变化映射到 DOM 的行为.你可以使用Vue.directive(id, definition)的方法传入指令id和 ...
- memcached look status
$ STAT pid STAT STAT STAT version STAT pointer_size STAT rusage_user 7.054927 STAT rusage_system 14. ...
- 网络抓包--Wireshark
Wireshark 是一款非常棒的Unix和Windows上的开源网络协议分析器.它可以实时检测网络通讯数据,也可以检测其抓取的网络通讯数据快照文件.可以通过图形界面浏览这些数据,可以查看网络通讯数据 ...
- SQL Server 储存过程的output 参数
要做的参数的回传一方面要做到有储存过程的配合,再一方面也要有调用方法的配合,也就是说错误的调用方法是没有办法把值回传的. 下面是例子 --1.储存过程方面的配合 create procedure db ...
- Git-常用命令集合
该文章会陆续添加内容,学习网页来自http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 ...
- rails总结
rails总结 注意:本文档以rails3.2版本为基础,并且用RubyMine 4.0.3作为ide 一.rails的结构与重要文件 Rails 是一个MVC库.同时,Rails的特点就是:惯用名优 ...