RFID实验二总结
来源:互联网 发布:java高级编程培训 编辑:程序博客网 时间:2024/05/22 04:45
没见过debug还这么麻烦的。。。。
龙云尧个人博客,转载请注明出处。
CSDN地址:http://blog.csdn.net/michael753951/article/details/70307683
个人blog地址:http://yaoyl.cn/rfidshi-yan-er-zong-jie-2/
在实验过程中,需要不断翻阅实验课PPT之《03 电子钱包的安全管理》,《实验3文档》,CSDN大佬吕浪的课程总代码,以及他的博文Java card开发系列文章。
然后再自己不断重写代码,理解整个实现过程,才能对这个课程实验有较为深入的了解。
代码在未征得本人同意之前,请勿直接Ctrl+C,Ctrl+V,谢谢。
正式实验
实验分析
首先我们要知道本次实验中需要修改哪些函数,实现那哪些功能。
首先我们在PPT中知道本次实验的主要目的是:
- 过程密钥的生成
- 消息验证码MAC或交易验证码TAC的生成
再看详细内容,我们大概可以捋清如下关系:
- 过程密钥的生成
- 输入数据包括“伪随机数+电子钱包联机交易序列号+8000”
- 子密钥指的是圈存或消费密钥
- 秘钥8字节长密钥
- 秘钥生成过程由3次完成
- 子秘钥左半部分加密
- 子秘钥有半部分解密
- 子秘钥左半部分加密
- MAC_TAC的生成
- 数组初始化为0
- 数据末尾填充0x80
- 数组补0x00直到数组长度为8的倍数
- 数组分割成数据块
- 按照PPT**《03 电子钱包的安全管理》P13**的过程,生成MAC或者TAC
在有了大概思路以后,我们开始阅读源代码。经过简单寻找,我们发现本次实验涉及的代码大多集中在PenCipher.java中。
基本的构造函数和对称加密des的运算函数,这部分函数在ppt上都有解释,推荐把ppt代码复制上来方便阅读和理解。
这几个函数就是我们本此实验需要填写的函数了。第一个gen_SESPK是过程秘钥生成函数,后面3个都是MAC或者TAC生成中需要使用的函数。
开始打码
前面的分析中,我们已经对本次实验有了大致的了解,接下来就是开始打码的过程了。
过程秘钥的产生
我们在PPT《03 电子钱包的安全管理》中已经知道了过程秘钥分为3步,分别是子秘钥左半部分加密,子秘钥右半部分解密,子秘钥左半部分解密。在仔细查看gen_SESPK
函数传入参数的各种意义,以及cdes
函数的参数意义以后,我们就可以调用cdes实现3步产生秘钥了。
MAC或者TAC的产生
接下来是异或操作函数,根据TA的提示,一个简单for循环搞定。
根据提示,pbocpadding
也可以很简单的实现。这个地方本来想写一个new新开空间的,因为数组在填充的时候可能会爆空间。但是在完成代码以后,发现结果总是不正确,最终发现有可能是因为在函数栈中声明的空间,在return之后,栈里的空间也被回收掉了,导致data实际上没有完成新开空间的操作。所以无奈注释掉,然后之后在debug的时候,故意给data开辟很大的空间以免爆空间。
填充完成以后,就可以按照PPT《03 电子钱包的安全管理》P13的过程,生成MAC或者TAC了。这个部分要注意的是最后写回mac的时候,只用取前4位就行,因为mac的响应报文中,只有4个byte,而加密完生成的数组有8bytes,不控制长度就会爆掉。
到这里,整个实验二就结束了。在填写完代码之后整个思绪都变得异常清晰,严格按照PPT中的流程,我们就能够填写完本次实验的代码,整体并不难。通过实验其实可以发现,网上流传的实验课完整代码并不十分简洁,不少地方有冗余。(事后诸葛亮2333)
验证实验
本次实验需要使用Dex.exe进行验算结果。
因为实验中不能直接使用printf进行debug,所以我们只能手动利用ISOException.throwIt
进行debug,或者利用rfid卡的写会操作,将结果直接作为写回,在控制台上打印出来。
因此,我们就需要修改Purse
的process
了。
使用某一个ins,控制将mac生成,并且写回。需要注意的是,我们不能一开始就直接写回加密生成的mac值,如果直接执行就会写回0x6D00(INS value not supported)。
这个地方坑了我很久。所以我们需要在process中使用条件控制,让我们能够先执行上次实验中,创建purse等操作,才能进行本次实验的加密生成mac地址并且写回操作。
因此我们首先执行purse_script(我的实验一的脚本文件),文件生成完成以后,我执行/send 80620000073fffffffffffff
随便进行测试一下。算法生成的结果如下图所示,为0x795DB66C。注,其中9000是正确执行返回的结果。
秘钥为自定的0x1212121212121212
,data为自定的0x2222222222222222
(测试data只有8个0x22,之所以在代码中有16个22,是因为后面8个0x22纯粹用来凑数,以开辟一个足够大的数组以免爆炸。)初始向量在gmac4中已经定义为0x1111111111111111
。
将这些参数在Dex.exe中计算(数据需要手动添加80和其他00),计算结果为0x795DB66C0F3467BB
。我们知道在取mac地址的时候,我们为了防爆(溢出),将结果的前4个byte取出放进mac
,所以前四位为0x795DB66C
,和我们的代码一致。
故而我们认为,本次实验成功。
- RFID实验二总结
- RFID实验一总结
- RFID实验三总结
- RFID实验
- RFID作业二
- RFID基础知识总结
- RFID技术总结
- RFID学习(二)国际标准
- Arduino NFC实验,Arduino读取RFID信息
- RFID项目总结(陆续更新)
- 总结rfid理论基础知识要点
- 总结rfid理论基础知识要点
- 总结RFID理论基础知识要点
- RFID
- RFID
- RFID
- RFID
- RFID
- 快速排序java实现
- Windows下Mongodb安装及配置
- 石头剪刀布
- 场景切换问题:如何切换到已经打开的场景
- shuoj_1559
- RFID实验二总结
- redis启动出错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
- 在JavaScript中使用document.getElementById()获取对象失败的原因
- Docker可视化管理工具Shipyard安装与配置
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
- 三种方法让Response.Redirect在新窗口打开
- Python学习笔记(六)——面向对象编程
- WSL问题之32位程序运行
- cmake 解决错误:Cannot specify link libraries for target