水卡加密分析记录
小区接水的水卡在使用时不能直接查询到卡内的余额,于是用 PN532 拿到里面的 dump 数据,转换为 txt 文档后,分析卡里的余额还剩下多少
拿到数据
首先使用 PN532 设备读取了目前卡内的数据,得到了 1.dump
文件,并转换为 1.dump.txt
格式
接着去取了 1 元的纯净水,读取卡内现在的数据,得到了2.dump
文件,并转换为 2.dump.txt
格式
为了方便分析,首先使用 git
自带的 diff
命令进行差异分析
打开 2.dump.txt
文件,发现变化的数据在 4 扇区
,有三部分数据发生了变化
金额位
2.dump.txt
的4 扇区 1 区块
里面的50 14
为金额位,后面的AF EB
为金额的校验位
打开:在线进制转换
将金额位颠倒,变为 14 50
,十六进制转化为 10 进制,发现卡内余额为 52.00 元
接着验证一下是否正确,输入水卡消费之前的金额,即 1.dump.txt
的 4 扇区 1 区块
里面的 B4 14
金额位
颠倒后进制转换验证,发现金额是 53.00 元,说明金额位的换算是正确的
金额校验位
在 2.dump.txt
的 4 扇区
里面里面还有一部分数据,为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
注意!本次分析仅用于查看水卡余额,并学习里面的验证思路,仅作为学习用途!