## 关于 GSM 加密的一些资料

最近想弄双卡通，但是我的 K700 插卡的位置非常薄，那种剪卡的一卡通不见得好用。于是看了一些关于拷卡的内容，遗憾的是，似乎 05 下半年和以后的移动卡都是 V2 加密的了，用现有的拷卡软件没戏拷出来。虽然一堆厂商都声称在开发 V2 的破解软件，不过我觉得就是扯淡。一篇 blog 不能写太短，那就简单讲讲刚看的关于 GSM 加密的内容吧：

GSM 的加密系统里面大致涉及三种算法，A3,A5,A8，这些并不特定指代什么算法，只是给出算法的输入和输出规范，以及对算法的要求，GSM 对于每种算法各有一个范例实现，理论上并没有限制大家使用哪种算法。但是世界上的设备商和运营商都是很懒得沟通的，看到既然有了范例实现，就都拿来用了，于是全世界的 SIM 卡被破解了都一样拷法。

说到这里就不能不简单介绍一下 SIM 卡, SIM 卡是一种智能卡片，里面有个非常简单的 CPU 和一点 NVRAM，可以存储和读出数据，还可以进行一些运算。卡里面有很多内容，不过我只介绍和加密相关的。每张 SIM 卡里面一般都存着一个全球唯一的标志号，叫做 IMSI，这个是用来唯一标识你 SIM 卡的，手机在开机时候会从卡里面读出这个号发给移动网络，移动那里有一个很大的数据库，描述了 IMSI 和手机号的对应关系，于是网络就知道你的手机号是多少了（如果你手机卡丢了去补，新补来的卡 IMSI 和原有的不同，而移动数据库那里将你原来的手机号指向新的 IMSI，旧的卡就再也不能用了）除了 IMSI ，还有 16 个字节的密钥数据，这个数据是无法通过 SIM 卡的接口读出的，通常称为 Ki， Ki 在移动网络那边也保存了一份。

在手机登录移动网络的时候，移动网络会产生一个 16 字节的随机数据(通常称为 RAND)发给手机，手机将这个数据发给 SIM 卡， SIM 卡用自己的密钥 Ki 和 RAND 做运算以后，生成一个 4 字节的应答(SRES)发回给手机，并转发给移动网络，与此同时，移动网络也进行了相同算法的运算，移动网络会比较一下这两个结果是否相同，相同就表明这个卡是我发出来的，允许其登录。这个验证算法在 GSM 规范里面叫做 A3，m = 128 bit, k = 128 bit, c=32 bit，很显然，这个算法要求已知 m 和 k 可以很简单的算出 c ，但是已知 m 和 c 却很难算出 k 。A3 算法是做在 SIM 卡里面的，因此如果运营商想更换加密算法，他只要发行自己的 SIM 卡，让自己的基站和 SIM 卡都使用相同的算法就可以了，手机完全不用换。

在移动网络发送 RAND 过来的时候，手机还会让 SIM 卡对 RAND 和 Ki 计算出另一个密钥以供全程通信加密使用，这个密钥的长度是 64 bits, 通常叫做 Kc, 生成 Kc 的算法是 A8 ，因为 A3 和 A8 接受的输入完全相同，所以实现者偷了个懒，用一个算法同时生成 SRES 和 Kc 。

在通信过程中的加密就是用 Kc 了，这个算法叫做 A5 ，因为 A5 的加密量很巨大，而且 SIM 卡的速度很慢，因此所有通信过程中的加密都是在手机上面完成的，这样一来，除非天下所有 GSM 手机都至少支持一种相同的 A5 算法，否则就没法漫游了，这时候运营商和设备商的懒惰又体现出来了，全世界目前只有一种通用的 A5 算法，没有其他的，这个算法就是和 Kc 的 8 字节序列进行简单的循环 XOR，再和报文序号做个减法。

上面只是简单的介绍 GSM 的加密通信过程，实际上 GSM 的操作比这个还要复杂一些，比如除了第一次登录时候用真正的 IMSI ，之后都是用商定的临时标识 TMSI ，不过这个不是今天讨论的重点。

下面就来说说为啥手机卡可以被复制。

从前面的介绍里面我们知道，要完成一次登录过程，IMSI 和 Ki 是必不可少的，A3 算法也需要知道，这其中, IMSI 是直接可读的，但是 A3 算法和存在你的卡里面的数据，都是不知道的，手机只是简单的把 RAND 给 SIM 卡, SIM 卡把算好的数据返回。实际设备中使用的 A3 算法被作为高级商业机密保护起来。但是世界上没有不透风的墙，在 1998 还是 1999 年的时候，有人从哪里偷到了几页纸的相关文档，然后把这文档输入了电脑。后来这个文档落到了加州伯克力几个教授手里面。这个文档里面缺少一些东西，而且还有写错的地方，这几个牛教授们拿一个 SIM 卡比对了一阵子，把缺的补上了，错的也给修正了，于是这个算法就成为了世人皆知的秘密。这个算法又被叫做 Comp128 ，他同时生成 SRES 和 Kc ，代码在这个文件里面。

http://blog.kangkang.org/wordpress/wp-content/uploads/2006/06/a3a8.txt

光有了算法还是不能够得到在 SIM 卡里面保存的 Ki, 理论上面是可以把 SIM 卡拆了，然后把芯片接到特殊设备上面来读出 Ki ，但是这个听起来就像用小刀在硬盘上面刻操作系统一样不靠谱。于是很多有志之士就开始了对 Comp128 算法的攻击，在一开始大家想到的肯定是穷举，不过这个 GSM 的设计者也想到了，SIM 卡里面有个逻辑是一共只能查询 2^16 次左右，之后卡会自杀，让破解者啥都得不到。因此研究者们试图在可以接受的次数之内通过构造特定明文和分析输出秘文来分析出 Ki 的值，结果还真被大家发现出来了一些。在下面这个 pdf 里面有一些相关的内容介绍，IBM 的一个小组甚至用 6 次查询就可以彻底解出 Ki，当然现在外面卖的那种拷卡器肯定没有这么牛，但是看表现似乎都可以在几分钟之内破解 。

http://blog.kangkang.org/wordpress/wp-content/uploads/2006/06/S5.Brumley-comp128.pdf

随着时间的推移，针对 Comp128 的破解算法越来越成熟，商用的卡复制设备也越来越多，运营商们终于坐不住了。很多运营商都开始发行 Comp128 v2 加密算法的卡了。这其中就包括中国移动，我看了一下论坛上面的帖子，大部分都是在反映 05 年的新卡基本都没法用 simscan 之类软件读出 Ki 。Comp128 v2 算法是 GSM 协会在 v1 被攻破以后，迅速在 v1 上面修改得来的结果，据说比较好的解决了 v1 算法中的弱点，当然，这个算法像 v1 一样，还是不公布于众。。而且到现在也没有人公布出来。这样一来，基本就没法解了。现在网上面很多拷卡设备厂商说的正在研发 v2 解码，我觉得基本是扯淡，这个既要有足够内线，能从设备商那里盗窃到 v2 的算法库或者从其他位置盗窃到文档，还要有足够数学实力，能够找出算法漏洞。就凭这些作坊企业那还差得远点。

另外关于 GSM 加密，还有两个文档可以参考一下：

http://blog.kangkang.org/wordpress/wp-content/uploads/2006/06/gsmsty.pdf

http://blog.kangkang.org/wordpress/wp-content/uploads/2006/06/miei_lec_3.ppt

最后，有用过剪卡双卡通的出来说一声，那东西有多厚啊？K700C 能不能用。。或者谁知道联通今年的 UP 新势力是 v1 的还是 v2 的？我的全球通卡是 03 年的，应该是 v1 的没问题，但是另一张今年的 UP 新势力就不好说了。换卡也没有太大希望，我弄这个是为了给联通的人发短信省钱，老的如意通就算找到，也没有价值用的说。。