SIM卡实现原理

作者: 2d3725d1f0a8 | 来源:发表于2019-02-21 22:41 被阅读1次

    我们一般用的手机sim卡里面有三组数值是关键的:

    IMSI:全球唯一的标志号

    ICCID

    ki:鉴权和加密信息(Kc算法输入参数之一、密钥号);

    GSM的加密系统里面大致涉及三种算法,A3、A5、A8。

    简单介绍:

    SIM卡是一种智能卡片,里面有一个非常简单的MCU和一点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,再和报文序号做个减法。

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

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

      随着时间的推移,针对Comp128的破解算法越来越成熟,SIM复制设备也越来越多,运营商们终于坐不住了。很多运营商都开始发行Comp128 v2加密算法的卡了。Comp128 v2算法是GSM协会在v1被攻破以后,迅速在v1上面修改得来的结果,据说比较好的解决了v1算法中的弱点,当然,这个算法像v1一样,还是不公布于众的,而且到现在也没有人公布出来。这样一来,基本就没法解了。

      中国的运营商同样也遇到了SIM卡被复制问题,这里我主要讲讲中国移动。大约从2005年下半年发行的卡开始,已经不能直接用simscan等软件读出ki,但是,这并不是真正v2卡。有消息指出,v2卡虽然解决了能被复制的漏洞,但是兼容性和稳定性方面不尽人意。聪明的中国移动当然不会不管这个问题,它在成熟的v1卡基础上,自己做了小小的修改,巧妙的躲避了simscan等软件的扫描,达到不被复制的目的。这种卡我们暂时称作v0卡。v0卡是中国移动自己设计出来,据说是改变了原来ki的配对规律,使常规的扫描无法读出ki。

    eSIM的出现使用户彻底摆脱了SIM卡线下发卡环节的繁琐流程,全互联网化的业务流程使用户可获得随需即时入网的极致体验。

    终端商则终于摆脱卡槽束缚,得以在优化产品外观并提升性能方面多做文章,如减小体积、增加电池续航、增强防水能力等。

    SIM卡的历史演变过程

    手机只有插入SIM卡(客户识别模块)才能正常通讯几乎是人所共知的事情。我们可以很容易地从手机中插入/拔出SIM卡,因此更换起来相当方便,但要知道SIM卡的历史可要远短于手机出现的历史。历史上的第一代手机仅支持’嵌入式’通讯标准:入网参数被硬编码到手机终端内存中。

    类似于NMT-450这样最古老的模拟标准并未采用任何安全保护措施:订阅数据可任意被复制到另一部手机,如此便能以机主的身份免费拨打和接通电话了。

    之后不久便推出了第一代被称为’用户识别安全(SIS)代码’的安全保护措施 —总共有18位数字,每一部手机都拥有唯一的SIS代码并被硬编码到应用处理器内。SIS代码被均匀分配给了各家手机供应商,因此任意两部手机的SIS代码都不会重复。此外,手机处理器还保存了7位RID代码,一旦用户在蜂窝网络内注册即会被发送到基站。

    基站收到后则会随机创建一组数字,与唯一SIS代码捆绑后被回复到手机内,SIS处理器就用这两组数字来生成授权密钥。

    尽管密钥和数字相对较短,但对于1994年来说已足够安全—但不出意料,系统随后即被破解,在这之后三年GSM(全球移动通信系统)标准出现了。GSM标准设计本身就较为安全,采用了类似于SIS但更加隐秘的回复授权系统。该标准的安全性在当时可以说是无可匹敌。

    这意味着整个授权过程完全在集成入智能卡的外部处理内进行。现在人所共知的SIM最终成为了解决方案。随着SIM卡的推出,入网不再需要单纯依靠手机,手机用户因此能频繁更换手机,只需保留拥有移动识别功能的SIM卡即可。

    SIM卡基本上来说就是一种 ISO 7816标准的智能卡,与其它接触式基于IC的卡并无太大差异,例如:信用卡或电话卡。第一代SIM卡甚至在外形尺寸上也与信用卡相似,但外形缩小的整体趋势使得更新且结构更紧凑的SIM卡应运而生。

    由于传统的大尺寸1FF(第一代形状因子)SIM卡已不再适合插入手机,因此通讯行业发明出了一种简单且紧凑的解决方案:尺寸更小的SIM卡(mini-SIM,又称为2FF或第二代形状因子),也就是我们目前广泛使用的SIM卡。一般在新的SIM卡周围均连接了一个1FF大小尺寸的塑料框,更新的形状因子将芯片和触点排列限制在一个很小的卡片内,因此也方便于从手机中拔出。

    尽管在这之后还陆续推出了micro-SIM(3FF)和nano-SIM(4FF),但无论是形状、触点排列以及嵌入芯片的特性仍然和25年无太大差别。直到如今,仍有厂家生产大尺寸的塑料’仿制品’,以满足那些喜欢怀旧用户的需要。

    即便如此,如今许多过时的手机均无法支持现在的SIM卡,就算大小合适也无法使用。归根结底的原因是早期SIM卡的运行电压是5V,而如今SIM卡的工作电压则为3V。许多SIM生产厂家为了降低成本而不惜牺牲兼容性,使得如今大多数SIM卡均无法同时支持两种工作电压。因此只能兼容5V工作电压的手机无法使用3V的SIM卡,原因是受到手机处理器电压保护的限制。

    尽管在SIM卡生产过程中,一些信息已被写入到SIM卡内存中:IMSI(国际移动用户识别码)根据批量订购SIM卡的移动运营商要求及被称为Ki(密钥识别码)的128位密钥决定。简而言之,IMSI和Ki分别相当于用户的登录名和密码,被硬编码到SIM卡芯片内。

    用户IMSI和手机号码之间的通信则被保存在被称为HLR(归属位置寄存器)的专门数据库内。如用户在另一基站以临时’访问者’身份注册,该数据就会被复制到另一个数据库-即各段网络内的VLR(访问者位置寄存器)。

    整个授权过程相当简单。一旦用户被注册到临时数据库内,VLR即会向手机号码发送随机的128位数字(RAND)。SIM卡处理器则根据RAND数字和Ki将用A3算法生成的32位数字回复(SRE)到VLR。一旦VLR获得匹配响应,即代表用户网络注册成功。

    SIM还会生成另一个称为’Kc’的临时密钥。使用A8算法并根据上述提到的RAND和Ki计算出’Kc’值。然后再用这一数值并通过A5算法对传输的数据进行加密。

    由于有太多的首字母缩写,因此听上去似乎有些复杂。但基本的道理非常简单:首先,将你的登录名和密码硬编码到SIM;其次,借助几种算术技巧创建验证和加密密钥,就这么简单—入网成功。

    加密通常都默认启用,但某些情况下(例如:返厂保修)也会关闭,这时情报机构就有了可乘之机:拦截通话内容。加密一旦被关闭,老式手机屏幕则会显示一个’打开的锁’图标,但现代手机(除了黑莓手机)则不会有任何提示。

    目前有一种专门用来拦截手机通话内容的网络攻击;为了实施此类攻击,不法分子需要一部被称为IMSI Catcher的设备。它能模拟基站并寄存正在通话中的电话,随后再将所有信号转送至真的基站。

    这种情况下,整个授权过程以正常模式(无需破解加密密钥)进行,但伪基站会要求手机以纯文本模式传输数据,如此不法分子就能神不知鬼不觉的情况下拦截信号。

    有趣的是,这一’漏洞’并非真正的漏洞;事实上,这一特性从一开始设计就已存在,因此一旦遇到上述情况,情报部门完全可以实施’中间人‘攻击。

    相关文章

      网友评论

        本文标题:SIM卡实现原理

        本文链接:https://www.haomeiwen.com/subject/ufyjyqtx.html