1. 程式人生 > >GSM A5/1演算法C語言程式碼實現和分析

GSM A5/1演算法C語言程式碼實現和分析

介紹

全球超過200個國家和地區超過10億人正在使用GSM電話。對中國使用者來說,GSM就是移動和聯通的2g模式。
GSM

在1982年A5首次提出時,人們認為A5 / 1金鑰長度要128位,但最終確定的結果是64位金鑰(政府可以使用暴力破解算出)。很可能是政府的壓力迫使金鑰位數縮短。事實上,據說英國認為只需要48位,而當時的西德政府推動更多的位數(因為他們擔心東德政府能夠破解他們的密碼)

A5演算法是一款主要用於GSM的加密演算法。該演算法本身在安裝於1億部行動電話時是祕密。
它最終在1999年8月公佈,並在一個月內,A5 / 2方法被破解。
如果沒有特別說明,通常所說的A5指的是A5/1。

具體分析

A5演算法的核心是3個移位暫存器:
在這裡插入圖片描述
上圖已經很清楚地說明了A5的移位暫存器的具體工作原理:
三個暫存器的第8,10,10bit是clock bit,意味著每次clock時,演算法會計算這三位的多數是0還是1,然後對處於多數的暫存器進行移位操作。
比如說暫存器1的第8位是0,暫存器2的第10位是1,暫存器3的第十位是0。那麼多數值就是0,然後對暫存器1和暫存器3進行移位操作。
程式碼如下:

typedef unsigned long ulong32;
void clock() { 
    ulong32 x1 = ((R1 & R1MID) >> 8) &
1; ulong32 x2 = ((R2 & R2MID) >> 10) & 1; ulong32 x3 = ((R3 & R3MID) >> 10) & 1; ulong32 maj = (x1 + x2 + x3) >= 2 ? 1 : 0; //計算多數值是0還是1 if (x1 == maj) { R1 = clockone(R1, R1MASK, R1TAPS); } if (x2 == maj) { R2 = clockone(R2, R2MASK,
R2TAPS); } if (x3 == maj) { R3 = clockone(R3, R3MASK, R3TAPS); } }

完整程式碼實現見GitHub:code

安全性

人們早在2000年就已經知道A5/1加密演算法中存在嚴重的安全問題了。
在2008年,A5/1加密演算法可以在幾小時內被破解。
我們可以通過彩虹表攻擊破解A5/1:
首先,安全研究人員利用了GSM通訊加密中的兩個安全漏洞,並且在普通商用硬體的幫助下,花費了55天的時間計算出了一個彩虹表。這個彩虹表的大小為984GB(已在網上公開)。
得到了彩虹表之後,安全專家就可以在幾秒內確定用於加密通訊資料的金鑰了。
具體的攻擊步驟見Do not trust your phone.

參考資料: