浅谈IC卡内数据算法

自从前几次破解一系列IC卡之后,有几个基友就问我卡内金额区的具体算法,也确实前几次的文章中对数据的算法说的不是很详细,所以在此再容我啰嗦一下吧。
声明:此文章只适合和本人一样的菜鸟观看,大牛勿喷。。。

先上一张图片,

研究过IC卡的人也许都能看出来,很明显的选中的这两行就是金额区,所以我们就来通过计算一下这里边的金额来说一下其中的算法。
我们来看一下,这两行数据是一模一样的,当然有的卡里边可能不一样,或者只是后边的地址位不一样,不过这些都不影响的,好了废话不多说,我们就把这个最常见的卡内的这些信息分析一下,我们先逆向分析来一遍,也就是先看卡内数据,然后一步步转换成金额数据。
我们只看选中的这两行就行,也就是

我们暂且把这行数据分成四段来看

第四段是地址位,所以我们可以忽略不看,但是写卡的时候也不要动它,就让它保持原来的样子就行。第1和第3段是一样的。中间的FFFF也不要管了。
我们接下来开始计算其中的数据,先看第1段是1027,因为它是十六进制的,所以1027先倒序之后就是2710,然后再转换成二进制就是10011100010000,在计算的时候大家要记好一个十六进制数对应的是4个二进制数,所以前面转换的二进制其实应该是0010 0111 0001 0000,如果位数不够的话就在前边补零,然后再转换成十进制就是10000,因为保留两位小数,所以10000在刷卡时候就是100.00也就是100块。
再来看第二段EFD8,EFD8倒序一次是D8EF,然后转换成二进制就是1101 1000 1110 1111,然后再取这个二进制的反码,就是0010 0111 0001 0000,取反之后再转换成10进制就是10000,还是100块,只是这两个存储的方式不一样罢了,第3段和第1段是一样的,所以在计算方面,只计算第1段和第2段就行了。现在我们计算的是倒着来的,也就是从卡内的数据转换成具体金额的方法。也就是逆向计算的。
下面我们把这个具体的思路再整理一下:
1段数据算法(非逆向):十进制金额→转二进制→转十六进制→倒序。
2段数据算法(非逆向):十进制金额→转二进制→取反码→转十六进制→倒序。
下面是逆向计算数据的算法,其实就是把上面的反过来罢了,逆向计算的通常是为了验        证一下计算的数据有没有出错,算法如下:
1段数据算法(逆向):十六进制倒序→转二进制→转十进制。
2段数据算法(逆向):十六进制倒序→转二进制→取反码→转十进制。

好了,这个最基本的算法就是这样了,我觉得已经够具体了吧,就这样吧。

【via@f4ck 萱萱