RFID实验二总结

没见过debug还这么麻烦的。。。。

龙云尧个人博客,转载请注明出处。

CSDN地址:http://blog.csdn.net/michael753951/article/details/70307683

个人blog地址:http://123.207.243.115:81/rfidshi-yan-er-zong-jie-2/

在实验过程中,需要不断翻阅实验课PPT之《03 电子钱包的安全管理》,《实验3文档》,以及不知名大佬的课程总代码,CSDN大佬吕浪的Java card开发系列文章

然后再自己不断重写代码,理解整个实现过程,才能对这个课程实验有较为深入的了解。

最终的代码地址:https://github.com/LongyunYao/RFID_lab/

代码在未征得本人同意之前,请勿直接Ctrl+C,Ctrl+V,谢谢。

正式实验

实验分析

首先我们要知道本次实验中需要修改哪些函数,实现那哪些功能。

主要内容

首先我们在PPT中知道本次实验的主要目的是:

  • 过程密钥的生成
  • 消息验证码MAC或交易验证码TAC的生成

过程秘钥的产生

3DES

MACorTAC

MACorTAC2

再看详细内容,我们大概可以捋清如下关系:

  • 过程密钥的生成
    • 输入数据包括“伪随机数+电子钱包联机交易序列号+8000”
    • 子密钥指的是圈存或消费密钥
    • 秘钥8字节长密钥
    • 秘钥生成过程由3次完成
      • 子秘钥左半部分加密
      • 子秘钥有半部分解密
      • 子秘钥左半部分加密
  • MAC_TAC的生成
    • 数组初始化为0
    • 数据末尾填充0x80
    • 数组补0x00直到数组长度为8的倍数
    • 数组分割成数据块
    • 按照PPT《03 电子钱包的安全管理》P13的过程,生成MAC或者TAC

在有了大概思路以后,我们开始阅读源代码。经过简单寻找,我们发现本次实验涉及的代码大多集中在PenCipher.java中。

PenCipher构造函数

des运算函数

基本的构造函数和对称加密des的运算函数,这部分函数在ppt上都有解释,推荐把ppt代码复制上来方便阅读和理解。

需要填充

这几个函数就是我们本此实验需要填写的函数了。第一个gen_SESPK是过程秘钥生成函数,后面3个都是MAC或者TAC生成中需要使用的函数。

开始打码

前面的分析中,我们已经对本次实验有了大致的了解,接下来就是开始打码的过程了。

过程秘钥的产生

我们在PPT《03 电子钱包的安全管理》中已经知道了过程秘钥分为3步,分别是子秘钥左半部分加密子秘钥右半部分解密子秘钥左半部分解密。在仔细查看gen_SESPK函数传入参数的各种意义,以及cdes函数的参数意义以后,我们就可以调用cdes实现3步产生秘钥了。

gen_SESPK

MAC或者TAC的产生

接下来是异或操作函数,根据TA的提示,一个简单for循环搞定。

xorblock8

根据提示,pbocpadding也可以很简单的实现。这个地方本来想写一个new新开空间的,因为数组在填充的时候可能会爆空间。但是在完成代码以后,发现结果总是不正确,最终发现有可能是因为在函数栈中声明的空间,在return之后,栈里的空间也被回收掉了,导致data实际上没有完成新开空间的操作。所以无奈注释掉,然后之后在debug的时候,故意给data开辟很大的空间以免爆空间。

pbocpadding

填充完成以后,就可以按照PPT《03 电子钱包的安全管理》P13的过程,生成MAC或者TAC了。这个部分要注意的是最后写回mac的时候,只用取前4位就行,因为mac的响应报文中,只有4个byte,而加密完生成的数组有8bytes,不控制长度就会爆掉

gmac4

到这里,整个实验二就结束了。在填写完代码之后整个思绪都变得异常清晰,严格按照PPT中的流程,我们就能够填写完本次实验的代码,整体并不难。通过实验其实可以发现,网上流传的实验课完整代码的撰写者代码能力一般,不少地方有冗余。(事后诸葛亮2333)

验证实验

本次实验需要使用Dex.exe进行验算结果。

因为实验中不能直接使用printf进行debug,所以我们只能手动利用ISOException.throwIt进行debug,或者利用rfid卡的写会操作,将结果直接作为写回,在控制台上打印出来。

因此,我们就需要修改Purseprocess了。

Purse新增debug

使用某一个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运算结果

将这些参数在Dex.exe中计算(数据需要手动添加80和其他00),计算结果为0x795DB66C0F3467BB。我们知道在取mac地址的时候,我们为了防爆(溢出),将结果的前4个byte取出放进mac,所以前四位为0x795DB66C,和我们的代码一致。

故而我们认为,本次实验成功。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信