A5/1流密码算法的实现与分析
1. 背景简介
关注GSM手机网络安全的人都知道,21年来,全球35亿人一直在使用的传统64位GSM手机网络加密技术最近已经被公开破解,窃听手机现在已经不是国安 局的专利了,任何人都可以利用破解出来的密码本破译截获的手机信息。安全专家们此前曾展示过一套不法分子可用于窃听并破解64位GSM信号的设备,这套设 备的成本低于1000美元(大部分所使用的破解软件都是免费开源软件)。这种情况不禁令普通百姓,甚至持有商业秘密的大公司心惊肉跳。更令人感到害怕的是手机运营商的态度,当28岁的德国电脑工程师Karsten Nohl宣布破解了64位GSM加密系统之后,他们只是承认了这套系统在安全方面存在的问题,却迟迟不肯出台新的加密算法。
现在,连更高级别的手机通讯加密机制--KASUMI系统--这个采用128位A5/3加密算法的系统也已经被人们成功破解,这套系统正被目前新兴的3G网络所使用。相比去年破解64位的A5/1加密系统时采用Nvidia GPU集群花费了数月时间破解出2TB密码本的工作,这次破解行动则使用了更为复杂的算法(related-key sandwich attack)来破解128位加密系统,而且破解的过程只花了2个小时。
这次破解是由以色列Weizmann科学学院( Weizmann Institute of Science )数学系以及计算机科学系的教职员工完成的。参与这次破解的有 Orr Dunkelman, Nathan Keller和Adi Shamir,其中Adi Shamir便是大名鼎鼎的RSA公钥加密算法的发明人之一。他们所使用的破解算法采用了一种不断更换密钥的方法,“我们只需要使用4个相关联的密钥。226个数据,230比特内存,经过232次计算便可以完成破解。计算的复杂性很小,我们使用单台PC机只花了
不到两个小时便模拟了整个破解过程。
不过据Karsten Nohl教授介绍,这种破解方式从有效性上看不如之前的A5/1破解方式,由于这种破解方法必须事先编好数百万条内容已知的明文,然后再把这些明文一一放到运营商的无线网络中进行传输,之后截获这些信息并对运营商的加密方式进行破解,因此虽然破解计算本身速度很快,但传送明文并搜集截获的信息所花费的时间却需要很长。
目前运营商所使用的KASUMI(A5/3)加密算法是在MISTY算法的基础上改进而来。MISTY算法是由三菱的工程师开发出来的,原始的MISTY算法保密性更强,但所需完成的计算任务则比KASUMI算法更为繁重。
一句话,大量的预计算似乎破解A5/3并不容易。(参见reflextor.com/trac/a51)
而本文专注的是A5/1算法的实现,及相应方程系统的描述。
2. A5/1算法结构
直接图示了……
图1 A5/1算法
图2 A5/1算法结构
图3 A5/1算法描述
图4 A5/1算法
3. 代码实现
- #include <stdio.h>
- /*LSB---低字节位*/
- /*MSB---高字节位*/
- /* Masks for the three shift registers */
- #define R1MASK 0x07FFFF /* 19 bits, numbered 0..18 */
- #define R2MASK 0x3FFFFF /* 22 bits, numbered 0..21 */
- #define R3MASK 0x7FFFFF /* 23 bits, numbered 0..22 */
- /* Middle bit of each of the three shift registers, for clock control */
- #define R1MID 0x000100 /* bit 8 */
- #define R2MID 0x000400 /* bit 10 */
- #define R3MID 0x000400 /* bit 10 */
- /* Feedback taps, for clocking the shift registers.
- * These correspond to the primitive polynomials
- * x^19 + x^5 + x^2 + x + 1,
- * x^22 + x + 1,
- * x^23 + x^15 + x^2 + x + 1.
- */
- #define R1TAPS 0x072000 /* bits 18,17,16,13 */
- #define R2TAPS 0x300000 /* bits 21,20 */
- #define R3TAPS 0x700080 /* bits 22,21,20,7 */
- /* Output taps, for output generation */
- /* 高位是高字节 */
- #define R1OUT 0x040000 /* bit 18 (the high bit) */ </