没见过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中知道本次实验的主要目的是:
再看详细内容,我们大概可以捋清如下关系:
在有了大概思路以后,我们开始阅读源代码。经过简单寻找,我们发现本次实验涉及的代码大多集中在PenCipher.java中。
基本的构造函数和对称加密des的运算函数,这部分函数在ppt上都有解释,推荐把ppt代码复制上来方便阅读和理解。
这几个函数就是我们本此实验需要填写的函数了。第一个gen_SESPK是过程秘钥生成函数,后面3个都是MAC或者TAC生成中需要使用的函数。
前面的分析中,我们已经对本次实验有了大致的了解,接下来就是开始打码的过程了。
我们在PPT《03 电子钱包的安全管理》中已经知道了过程秘钥分为3步,分别是子秘钥左半部分加密,子秘钥右半部分解密,子秘钥左半部分解密。在仔细查看gen_SESPK
函数传入参数的各种意义,以及cdes
函数的参数意义以后,我们就可以调用cdes实现3步产生秘钥了。
接下来是异或操作函数,根据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
,和我们的代码一致。
故而我们认为,本次实验成功。