图2 面值表示
2.3 扣钱包
一次性电子钱包进行面值的初始化后,就可以执行减法操作了,但不能像S50那样执行加法和再充值等操作。一次性电子钱包减法操作分以下几个步骤:第一步,卡和读卡机之间相互通过身份认证和密码校验;第二步,从减法区的最后一个地址(第6000个)开始,以倒序的方法寻找最高位的被编程比特的地址,记为LBAddr第三步,从读卡机接受减法值S,用S除以面值区中的单位值 ,得到结果商Q和余数R,如果余数R不为0,则表明减法值S不是单位值 的整数倍,操作失败,否则进行下一步;第四步,用LBAddr减去减法区中的第一个比特的地址FBAddr,得到单位值使用次数UT,如果商Q和单位值的使用次数UT的和小于等于面值区中的次数T,则进行下一步,否则中断。第五步,LBAddr 加上商Q得到新的编程地址NBAddr,接到读卡机的编程命令后,编程第 NBAddr 个比特的值为1,并向读卡机返回减法操作成功的信息。
图3 扣钱包流程
扣钱包的操作步骤中,首先以倒序的方式寻找到第一个(以顺序的方法则是最后一个)被编程的Bit的地址,然后根据这个地址以顺序的方式算出该电子钱包中单位值的使用次数(即已消费的金额);如果再次消费的条件成立,则再次用顺序的方式算出这次消费被编程的地址,最后在这个地址上编程为1(所有Bit的初始化值为0)。这样每次做减法,无论减法值s是单位值的多少倍,都只编程一个Bit,本设计所采用的OTP 中,编程一个Bit 的数据大约只要200μs,而基于EEPROM的传统方法则要编程1281个Bit的数据,时间大约需要4ms,大大的缩小了编程时间。整个流程如图3所示。
2.4 读钱包
读钱包是指将余额读出,这是电子钱包中最基本的操作,其分三个步骤完成:第一步,卡和读卡机之间相互通过身份认证和密码校验;第二步,从减法区的最后一个地址开始,以倒序的方法寻找最高位的被编程比特的地址,记为LBAddr;第三步,用LBAddr减去减法区中的第一个比特的地址FBAddr,得到单位值使用次数UT,并用减法区中的可使用次数T减去UT得到电子钱包单位值的未使用次数RT;第四步,将U乘以RT得到余额R,然后返回给读卡机。
2.5 其它
除了具有一次性电子钱包的功能外,本设计还有共10块的存储空间供用户存储其它信息,可以作为一个具有加密功能的存储卡来使用。同时每个扇区对应着一个密码块,每个密码块都对应着一个密码指针。在密码指针为零时,加密校验使用的密码为默认密码,由数字电路自动给出。当用户对密码块进行编程后,就同时对相应的密码指针编程,此后加密校验操作就使用用户写入的密码。
3 电子钱包的实现
一次性电子钱包采用ISO/IEC 14443 TypeA 协议 ,兼容市面上流行的 MifareOne 系列指令 。除了不支持 INCREMENT 和RESTORE 指令外,其它指令格式与S50或其兼容卡一样。包括模拟电路,一次性电子钱包的芯片如图4所示。