教你如何破解IC卡的校验值

 
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

大一的时候,学校的洗澡卡和水卡是IC卡;有一次听室友说有人用白卡洗澡,就抱着试一试的心态买了一个acr-122,然后很轻松的破解了一个室友洗澡卡(当时就他一个买了洗澡卡,包括我在内的其他五个人嫌费用太贵没舍得买),提取了里面的数据,洗澡卡只知道金额在哪个扇区,其他的数据都不知道是什么意思就这样不明所以的用了一个学期(洗澡卡是能挂失的,我们当时知道水卡公司的后台肯定能检测到不正常消费)。结果第二个学期白卡不能用了,原卡也同样不能用了,我们意识到公司后台可能检测到这个卡号消费不正常,所以锁卡了。

怎么办呢?又不知道上面数据的联系,所以只能买新卡。

一开始是三个人买的,在买卡的时候我们三个是连着的,所以卡号也是连着的。当时我们发现他们是记下这个卡号和这个卡号是谁买的人学号和姓名电话(我们觉得胡编一个学号姓名都行),我们觉得他们就是发现消费不正常也不可能找到相关责任人的(证实了我们之前猜测的水卡公司与学校的信息是不互通的)。

总之这个洗澡卡虽然是连接后台的,但后台只检测消费是否正常,金额信息还是储存在卡里的

再入正题之前,我要先说明一下,不同厂家计算校验值的公式不同,有直接相加的、有使用与运算的,也有使用或运算的,也有取反,总之,就像你设置密码一样,厂家想用什么运算计算出校验值取决于厂家,就看你能否根据数据发现这个公式。这里附上另一篇也是关于破解校验值的博客,写的也是很不错的,希望对道友们有用,地址链接
下面是我对我们学校的水卡的校验值的计算过程。

买卡之后我们得到了三组新卡的数据(没有使用过的卡上面的信息更简单一些),如下图:
[转帖]教你如何破解IC卡的校验值-LMLPHP
[转帖]教你如何破解IC卡的校验值-LMLPHP
[转帖]教你如何破解IC卡的校验值-LMLPHP
由此可发现在金额相同(都是90.00元)的情况下,校验值是随着卡号的递增而加1的(第二行的数据的最后两个不知道是怎么算的,但第二行不重要,只要第一行正确就可以刷卡)。
注意:金额和卡号的数据都是反的。如金额是90.00,也就是将9000转化成十六进制为23 28,但在卡上表示的是28 23,卡号也是如此。

以为发现的规律,用Excel一直往后推,试了一下发现一直到卡号为14FF都是可以使用的。
但从卡号1500(十六进制)就显示错误。不知道原因是什么。
然后又有两个室友买了张新卡,数据如下:
[转帖]教你如何破解IC卡的校验值-LMLPHP
[转帖]教你如何破解IC卡的校验值-LMLPHP
按照我之前的思路推导的话这两个90.00元的卡的校验值应该分别是27、28,但实际却是28、29,比推导出来的大1。

为什么会这样呢?想了好长时间才想到一种可能:15比14大1。然后本着这个思路我又用Excel向后推了一部分数据,一直推到2000,如图:(第一列是卡号的第三列和第四列是转化成十六进制后的卡号和第一行的校验值)
再次说明,第二行的数据没有用(至少这一行的对错不影响使用)
[转帖]教你如何破解IC卡的校验值-LMLPHP
[转帖]教你如何破解IC卡的校验值-LMLPHP
[转帖]教你如何破解IC卡的校验值-LMLPHP

写在卡上之后试了一下,发现终于通过了。(这里当时有一点小的障碍,就是当校验值增加到FF的时候要怎么办?当时我是这样想的,FF表示255。也就是说如果不进位或者从00开始的话,它只能有256张卡(从00到FF),所以只能进位或从00开始。但进位显然不可能,因为现在的卡号已经是4000多了,为什么校验值还是两位,所以不可能向进位。那么只有从00开始了。事实证明我的想法是正确的的)。

但此时让我不满足的原因是我并没有发现校验值究竟是怎么计算出来的,也就是说我只能往卡上写入金额是90.00元的数据,不能写入其他金额的数据。虽然每次写入90.00元和每次写入三百元没什么区别,顶多是前者写的频率比后者多一些,但这一点让我觉得自己根本没有了解这些数据的关系到底是什么,一直有种被蒙在鼓里的感觉,让人很不爽。可能“人心不足蛇吞象”就是说的是我这类人吧……

为了推出关系,让我们再来看最后一个也是最关键的数据:第六个室友买了一张100.00元的洗澡卡。数据如下:
[转帖]教你如何破解IC卡的校验值-LMLPHP
如上图,用Excel我可以按照上文总结的规律推出以后的校验值,但此时我也只是知道100.00元和90.00元的各卡号的校验值,并不知道其他金额的校验值,而且要用一个卡号时我还要找到Excel查看,很麻烦。必须推出公式!

如上图,如果是90.00元的话,校验值应该是68(十六进制)。
虽然校验值的算法有很多,比如:取反运算,与运算,或运算,相加运算以及有可能的以上运算的多种结合。所以在不知道公式是什么的情况下去推导校验值公式虽说不是难于上青天,但也绝非易事。

我的想法是:由于校验值是随着卡号的增加而增加1的,所以校验值很可能由金额和卡号的数据简单地相加得到,为了得到公式,我只能用数据试了,
就拿这个数据来试:
[转帖]教你如何破解IC卡的校验值-LMLPHP
卡号:14BE 金额:2710(100.00元) 校验值:40
接下来用Excel依据另外五张90.00元的推出这个卡号14BE如果是在2328(90.00元)的情况下的校验值,是68(十六进制)。由此可得到90.00元时的校验值
卡号:14BE 金额:2328(90.00元) 校验值:68

我按照网上最简单的是相加试了一下(注意:以下均为十六进制的数据的运算 ):
14 + BE + 27 + 10 = 109(100.00元)
与校验值的差值是:
109 - 40 = C9

14 + BE + 23 + 28 = 11D(90.00元)
与校验值的差值是:
11D - 68 = B5

用得出的90.00元的差值B5检验下方的任意的一个数据
第一第二列是相应的十进制的卡号和校验值:
[转帖]教你如何破解IC卡的校验值-LMLPHP
检验卡号8200:20 + 08 + 23 +28 - B5 + 100 = BE(因为减去B5后为负数,所以要加上100(十进制的256,即16的平方)),经过对比上图可发现卡号为2008(十进制的8200)、金额为90.00的校验值就是BE。
100.00元的C9也可以得到对应100.00元的校验值。

但是为什么100.00元的差值是C9,而90.00元的差值是B5?
试了一番数据发现:23 + 28 - (27 + 10) = 14
而C9 - B5 = 14
即C9 = B5 + 14

剩下的就是中小学生的数学代入了,很简单的
继续代入可得:C9 = B5 + 23 + 28 - (27 + 10)

所以,对于卡号:14BE 金额:2710(100.00元) 校验值:40,还记得上文中的算式吗:
“ 14 + BE + 27 + 10 = 109 (100.00元)
与校验值的差值是:
109 - 40 = C9 ”

所以,40 = 109 - C9 = 14 + BE + 27 + 10 - [ B5 + 23 + 28 - (27 + 10) ]
进而可化简为:
40 = 14 + BE + 27 + 10 + 27 + 10 - (B5 + 23 + 28);这里括号里面已经是常数了,不会变化
而B5 + 23 + 28 = 100 所以 上式中减去(B5 + 23 + 28)相当于取模的作用;

所以
40 = (14 + BE + 27 + 10 + 27 + 10)%100
可以简单的概括为:
校验值 = (卡号 + 金额 * 2) %100;
(可代入上面的图片中验证一下)

Game Over!

我陆陆续续用了近一个学期的时间终于算出了这个校验值的公式,这期间也尝试着算出这个校验值,但总是没有思路而无奈地中途放弃,每次放弃时都有一种挫败感。
所以,这个暑假当结果出来的时候我真的是激动地热泪盈眶,真是皇天不负有心人啊!

当万万没想到的是暑假时,学校可能发现了问题,升级了全部的刷卡器,水卡、洗澡卡及饭卡均合并为一张卡,而且是sak=20的CPU卡,几乎无解。提取卡中的数据,里面的只有零扇区第0区块有一行卡号,其他的扇区没有任何信息。当时就知道这卡是联网的,每次消费时需要验证卡号。
天知道我的心里真是崩溃的:好不容易算出了校验值,结果你TMD换卡了,真的是欲哭无泪啊,好歹让我们上完你再换啊!!
[转帖]教你如何破解IC卡的校验值-LMLPHP

说实话,我觉得现在大学里刷卡系统越来越完善了,想钻空子也越来越难了,几乎所有的消费活动要么是支付宝和微信付费,要么向我们学校一样是联网的一卡通消费,几乎没有漏洞可钻。像这类的文章在将来对大学生几乎没有用处,有可能对高中生或者是初中生最帮助。

哎……心里有一万头曹尼玛奔腾而过……
[转帖]教你如何破解IC卡的校验值-LMLPHP

05-02 18:24