Hello大家好,这里是LanternMark,今天给大家分享一下我的一次水卡破解经历。

(本文只技术交流分享,滥用者自行承担责任,与本文作者无关)

0x0.前言

IC卡,即Integrated Circuit Card,集成电路卡,像我们平常看到的银行卡,地铁卡,还有校园里的饭卡,智能校徽等等,这些都属于IC卡。想必大家一定不陌生,但是大家有没有关注过IC卡的原理以及安全性。希望通过这篇文章,给大家一些启发。

0x1.准备工作

工欲善其事,必先利其器。在开始读卡之前,先准备好以下的东西:

  • 一块读卡芯片(比如PN532)
  • 一台有NFC功能的手机,和配套的软件(比如MCT)
  • 一张水卡
  • 一颗耐心(很重要)

​ 芯片这里我用的是PN532,一块很便宜的读卡芯片,某宝上30多就能买到了,都准备好之后,就可以开始破解了。

0x2.开始破解

​ 首先,先打开手机的NFC功能,读取一下这张水卡,会得到以下的结果。

​ 可以看到,除了13扇区之外,其他扇区都是用的默认密钥,这就给这张卡片带来了很大的安全风险,因为像这种没有全部加密(半加密)的卡片,是可以利用IC卡漏洞轻松破解的,这里我们来用PN532配套的上位机尝试破解一下。

结果如下图:

很轻松就能获取13扇区的密钥

用了三分钟,秘钥就很轻松的被破解出来了,可见这种IC卡的安全性真的不高。不过用漏洞破解不是本文的重点,本文主要分享一个业余的人破解秘钥的过程。

0x3.数据分析

​ 通过上面一张卡的数据,我还是看不出来有什么联系,所以我又找了另外一些卡来破解寻找UID和密钥的关系。在扫了10+张卡片后,我可以初步知道UID和密钥的映射关系。

第一行是UID,第二行是Key

​ 由于这种卡的KeyB都是相同的,只有KeyA不一样,所以UID决定的是KeyA,而且KeyA有六位,而UID只有四位,通过上图,我们可以清晰地看到UID地每一位都决定着Key的一位。

映射关系

​ 知道了这个以后,事情就变得简单了起来(也许吧),只要找出每一位Key的映射关系,就能破解出密钥的计算公式。接下来就来讲讲我破解密码的过程,在IC卡中,运算关系无非是加减乘除,异或和取反等等,只要有足够的数据,连蒙带猜,应该能推算出来,就拿第一位来说,通过UID和对应的Key位进行运算,可以很容易看出是有规律的。

异或结果都是1E

​ 异或结果都相同,也就是说,由UID XOR 1E == 对应的Key,这样第一个映射关系就找出来了。第一位key的对应关系被这么容易找出来了,使我备受鼓舞,可开始找第二位Key的对应关系的时候,就遇到了困难。

作为一名高三学生,对于这方面并没有太多的专业知识,就连异或也是只了解一丢丢。对于密钥破解,只能是不停的猜测,比如破解第二位Key。

第二位Key

可以看到,第二个数字是通过 异或 1得到的结果,而第一位,就显得没有规律了,比如图中的

60 —> 81

6B —> B1

​ 出现了两个自变量对一个因变量的情况,这就很麻烦了,无法直接地观察。于是乎,我就把这些数据对应关系列出来,得到了以下的对应表 :

看起来毫无规律的表

这使得我当时破解工作陷入了低迷,,,但是,我没有放弃,我想:我看不懂的东西,应该是我不会的东西,那就只有异或是我没掌握的了。为此,我开始去钻研异或,还特意画了一张异或关系表

我知道我的字不好看

正是这张表,为后来的破解工作提供了很大的帮助,通过这张表,我了解到了异或的一些规律,比如相邻的两个数字对应的异或值也是相邻的。有了这张表,在结合上面的对应关系,我隐隐约约感觉到Key的计算是和异或有些关系,于是我开始了头脑风暴。我试了很多种模型,没有成功,但每次失败,都让我感受到离成功更近一步,终于,在一个炎热的午后(没错,南方的十二月还是很热的),一次英语听力即将开始的时候,我终于看出来了。

​ 首先,我发现虽然这些数没有直接的异或关系,但是不同异或结果之间的绝对距离是不变的,也就是说,只要我根据结果的数据之间相隔多少距离,可以反推出对应的异或的数字,比如说2往上数刚好隔了五个单位到8,又隔了三个单位到12(C),又隔了一个单位到14(E),这样的关系,让我联想到了凯撒密码

交错对应

这样的结果,都可以由UID 异或 0 得到结果,再类比凯撒密码,我得到了以下的对应关系

黑色是确定的数据,红色的是猜测的数据

可以看到,大部分数据还是符合关系的,只有一小部分不符合关系,而这不符合关系的一小部分数字,都是对应着下一位的数字,也就是说,由于某种原因,导致了数字进了一位,接下来,只要找出为什么进位就可以了,这是又要进行大数据分析了,列表

清晰明了

​ 通过对比,不难发现,要进位的UID第二位数都大于8,而不用进位的数字第二位数都小于9,至此,这位Key的映射关系已经出来了,接下来要做的,就是用数据验证猜想,为此,我又去找了10+张卡来验证,发现都符合我的结论,可以说,在一定范围内,我的猜想是成立的。Key的第二位破解工作圆满完成!

​ 剩下的4位Key也可以了这样类似的方法破解出来的,这里我就不一一赘述了。

0x4.结果验证

在破解出了Key的算法后,我用Python写了一个计算程序

一个很水的算法

​ 经过我已有的数据验证,这个计算方法都是成立的,

成立了

又成立了呢

0x5.后记

​ 像这种M1卡,也是十几年前的发明了。时代日新月异,被破解也是无法避免的事情。只是现在在很多地方,比如校园,都还在大范围使用这种卡,而且溯源性不强。希望能尽快升级成CPU卡,这样安全性就高很多了。

​ 破解是一个很有趣的过程,锻炼了我的思维能力,也加深了我对IC卡的了解,还让我懂得了数学的重要性。尽管过程很有趣,得到结果也很能让人获得成就感,但破解过程还是充满着艰辛。光推算秘钥的过程都写满了四张纸。

草 稿 纸

​ 最后,当你登上山顶后,收获的风景远比你付出的艰辛多得多。