小区接水的水卡在使用时不能直接查询到卡内的余额,于是用 PN532 拿到里面的 dump 数据,转换为 txt 文档后,分析卡里的余额还剩下多少

拿到数据

首先使用 PN532 设备读取了目前卡内的数据,得到了 1.dump 文件,并转换为 1.dump.txt 格式

接着去取了 1 元的纯净水,读取卡内现在的数据,得到了2.dump文件,并转换为 2.dump.txt 格式

为了方便分析,首先使用 git 自带的 diff 命令进行差异分析

打开 2.dump.txt 文件,发现变化的数据在 4 扇区,有三部分数据发生了变化

金额位

2.dump.txt4 扇区 1 区块 里面的 50 14 为金额位,后面的 AF EB 为金额的校验位

打开:在线进制转换

将金额位颠倒,变为 14 50,十六进制转化为 10 进制,发现卡内余额为 52.00 元

接着验证一下是否正确,输入水卡消费之前的金额,即 1.dump.txt4 扇区 1 区块 里面的 B4 14 金额位

颠倒后进制转换验证,发现金额是 53.00 元,说明金额位的换算是正确的

金额校验位

2.dump.txt4 扇区 里面里面还有一部分数据,为AF EB,这部分的得到过程如下

现在的金额为 5200,将 10 进制的 5200 转换为 2 进制数,并且如果转换后的 2 进制数不够 16 位,则高位补 0

转换后首先得到的结果为 1010001010000

1010 0010 1000 0 是一个 13 位,高位补 3 个 0,补足以后的结果为 000 1010 0010 1000 0

接着对这个 2 进制数取反,即 0 变 1,1 变 0,取反后的结果为 111 0101 1101 0111 1

将这个 2 进制数进制转换为 16 进制(需要注意去掉空格),结果为ebaf

ebaf颠倒,结果为AF EB ,就是上面的金额校验位

也就是 50 14 的对应金额 5200 的金额校验位为 AF EB

总结

验证一次消费之前的结果,即 1.dump.txt 文件

金额位为 B414 ,颠倒后为 14B4 ,16 进制转为 10 进制为 5300

5300转换为 2 进制,结果为1010010110100,也是 13 位数,高位补 3 个 0,结果为0001010010110100,对结果取反后为1110101101001011

取反后的结果转换为 16 进制为eb4b,颠倒后的结果为4beb,对应上面图片的金额校验位4BEB

注意!本次分析仅用于查看水卡余额,并学习里面的验证思路,仅作为学习用途!