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算法结构

直接图示了……

clip_p_w_picpath002

图1 A5/1算法

clip_p_w_picpath004

图2 A5/1算法结构

clip_p_w_picpath006

图3 A5/1算法描述

clip_p_w_picpath008

图4 A5/1算法

3. 代码实现

 

 
  
  1. #include <stdio.h>  
  2.  
  3. /*LSB---低字节位*/ 
  4.  
  5. /*MSB---高字节位*/ 
  6.  
  7. /* Masks for the three shift registers */ 
  8.  
  9. #define R1MASK 0x07FFFF /* 19 bits, numbered 0..18 */  
  10.  
  11. #define R2MASK 0x3FFFFF /* 22 bits, numbered 0..21 */  
  12.  
  13. #define R3MASK 0x7FFFFF /* 23 bits, numbered 0..22 */  
  14.  
  15. /* Middle bit of each of the three shift registers, for clock control */ 
  16.  
  17. #define R1MID 0x000100 /* bit 8 */  
  18.  
  19. #define R2MID 0x000400 /* bit 10 */  
  20.  
  21. #define R3MID 0x000400 /* bit 10 */  
  22.  
  23. /* Feedback taps, for clocking the shift registers.  
  24.  
  25. * These correspond to the primitive polynomials  
  26.  
  27. * x^19 + x^5 + x^2 + x + 1,   
  28.  
  29. * x^22 + x + 1,  
  30.  
  31. * x^23 + x^15 + x^2 + x + 1.   
  32.  
  33. */ 
  34.  
  35. #define R1TAPS 0x072000 /* bits 18,17,16,13 */  
  36.  
  37. #define R2TAPS 0x300000 /* bits 21,20 */  
  38.  
  39. #define R3TAPS 0x700080 /* bits 22,21,20,7 */  
  40.  
  41. /* Output taps, for output generation */ 
  42.  
  43. /* 高位是高字节 */ 
  44.  
  45. #define R1OUT 0x040000 /* bit 18 (the high bit) */  </