IC卡金額算法的淺淺研究

時隔快一年,終于想起來要更新IC卡算法破解的第二期了。之前第一篇關(guān)于水卡密鑰算法的破解那篇博客,還是我高三時候?qū)懙牧?,現(xiàn)在大一了,寫出的東西也會不一樣了。這次會介紹的詳細(xì)一點(diǎn)了。
第一篇博客傳送門:,不過那也只是我高中時候?qū)λ荑€的理解,現(xiàn)在已經(jīng)不一樣了。OK,現(xiàn)在我來介紹我最近一次,幫別人研究水卡金額的算法的一次嘗試,感謝@W提供素材。
警告:本文僅供學(xué)習(xí)討論使用,請勿拿去進(jìn)行其他不法用途,出什么問題,本人概不負(fù)責(zé)。
0x0.前言
本來沒打算寫金額篇的,因?yàn)楦咧心菚?,能力有限,還不能很了解金額算法的一些原理?,F(xiàn)在大學(xué)了,不在高中,數(shù)據(jù)也拿不到了,也寫不了。但是天無絕人之路,感謝@W老鐵給我提供了數(shù)據(jù),讓我得以完成水卡算法的第二個部分——金額篇
0x1.數(shù)據(jù)準(zhǔn)備
這次的數(shù)據(jù),可以說是非常的詳細(xì),而且數(shù)據(jù)量也很大。據(jù)不完全統(tǒng)計,足足有78條金額數(shù)據(jù)?。。∵@么大的數(shù)據(jù)量,給我的破解提供了很大的便利。
0x2.開始破解算法
拿到數(shù)據(jù)后,大概了解了一下數(shù)據(jù)的分布的格式,發(fā)現(xiàn)其格式是非常有規(guī)律的,如下:

前面四位是存儲金額的地方,理論最大值是FFFF,也就是655.35元。
中間四位是刷卡次數(shù)
后面四位是校驗(yàn)位,也就是本次破解算法的重點(diǎn)
知道了要破解的數(shù)據(jù)后,就到了分析數(shù)據(jù)的環(huán)節(jié),這時候就需要大量的數(shù)據(jù)了:

密密麻麻的數(shù)據(jù)(暈),這次的數(shù)據(jù)比較規(guī)整,這很利于我們進(jìn)行數(shù)據(jù)分析。還記得當(dāng)時,上C艸課的時候,太無聊了,就在研究這個數(shù)據(jù),當(dāng)時的我還是抱著之前密鑰算法破解的思維來嘗試破解這個金額算法,這個思維有好處,也有壞處。好處就是我很容易就知道從哪里入手分析,壞處就是,看問題不夠全面。不過這些都是正常問題啦。OK,回到主題。
我一開始發(fā)現(xiàn)的是后四位的第二位和第四位數(shù)字的和,是一個定值——8,例如:
9147 :1 + 7 = 8
894F:9 + F = 24 mod 16 = 8
6E6A:E + A = 24 mod 16 = 8
可以看到,第二位和第四位的值之和都是八(24去求余之后就是8),這樣,我們只要知道了第二位的算法,第四位也就可以算出來了。四舍五入,就相當(dāng)于我們已經(jīng)搞定了一位的算法了(雖然還不知道第二位怎么得出來的)。這次開局很容易,我就知道了第四位算法,但是接下來得破解工作,就沒有這么容易了。
現(xiàn)在還有三位需要破解,因?yàn)榈谒奈皇怯傻诙粵Q定的,所以我猜測第三位可能是由第一位決定的(現(xiàn)在看來不完全對)。在前面的48條數(shù)據(jù)中,可以看到后四位是當(dāng)金額變化了四次,才變化一次,

而且很多重復(fù)出現(xiàn)的。然后我開始找第一位和第三位的對應(yīng)關(guān)系,然后真的找出了一張映射表,

看著這熟悉的變化規(guī)律,仿佛之前在密鑰算法破解里面見過類似的算法,只要找到什么東西決定第三位是否用進(jìn)位,然后再找出什么決定第一位,就可以破解出算法了。然而,這個傳統(tǒng)的思路雖然看起來很直觀,但是,太繁瑣了,我隱隱感覺水卡真正的密鑰算法應(yīng)該是非常簡潔明了的,破解工作又暫時陷入了僵局。
0x3.突破瓶頸
破解的轉(zhuǎn)折點(diǎn)源自于開始破解工作開始的第二天晚上,那是一個星期五(不是野人),我去參加了社團(tuán)的系統(tǒng)維護(hù)課,課上,講解了一些數(shù)據(jù)校驗(yàn)碼的知識。其中,用到了許多異或操作,使得運(yùn)算出來的結(jié)果非常有規(guī)律。我突然想到,水卡金額校驗(yàn)位是不是也是通過異或得到的呢?有了思路之后,馬上開始著手研究,在嘗試了許多組合后,終于讓我找到了金額校驗(yàn)位計算的真正規(guī)律:
后四位校驗(yàn)位是由前面的金額+刷卡次數(shù)異或得來的,具體過程是:
以84.91這條數(shù)據(jù)為例,金額為212B,刷卡次數(shù)為2920,校驗(yàn)位為A92F

首先,將金額和刷卡次數(shù)和校驗(yàn)位前兩位進(jìn)行異或:
21^2B^29^20^A9
= AA
可以看到,結(jié)果是AA,再對剩余的數(shù)據(jù)進(jìn)行相同的操作可以發(fā)現(xiàn),異或的結(jié)果都是AA,所以這就破解出來了校驗(yàn)位的前兩位。
然后,經(jīng)過觀察和嘗試不難發(fā)現(xiàn),校驗(yàn)位前兩位和后兩位的和恒為28,所以用A9 與 28進(jìn)行和校驗(yàn),可以得出后兩位的值

至此,整個金額校驗(yàn)位的算法就破解完畢了,接下來要做的就是實(shí)踐一下。
0x4.金額模擬
按照上面的方法,我們來隨便模擬一個金額寫入,比如132.00元,首先13200轉(zhuǎn)換16進(jìn)制為0x3390

然后,刷卡次數(shù)我們可以隨便設(shè)置,這里我就設(shè)置成0000吧。這時候,按照上面的方法,用金額^刷卡次數(shù)^AA,就可以得到校驗(yàn)位的前倆位:

前兩位是09,再用09與28進(jìn)行和校驗(yàn),可以得到

后倆位是CF,所以校驗(yàn)位就是09CF,構(gòu)造一下金額數(shù)據(jù)

然后寫入卡中去測試一下

可以看到,模擬金額成功了,說明這個算法是正確的呢
0x5.總結(jié)
和之前的密鑰破解比起來,這次的金額校驗(yàn)位算法破解似乎更簡單了,因?yàn)楝F(xiàn)在的我和當(dāng)初的我不一樣了,有那么一點(diǎn)點(diǎn)進(jìn)步了,所以寫這篇文章記錄一下。我發(fā)現(xiàn),對于這些M1卡,似乎最常用到的就是異或