《密碼學系列》—— 流密碼
我們活著不能與草木同腐,不能醉生夢死,枉度人生,要有所作為。 ——方誌敏
本文已經收錄至我的GitHub,歡迎大家踴躍star 和 issues。
https://github.com/midou-tech/articles
點關注,不迷路!!!
新年就在這場疫情中悄無聲息地過去了,那我就趕在年尾給大家拜個晚年,2020祝大家多掙錢,多升職,多......那就多些平安健康,開心快樂,但是也別忘了關注龍叔,2020,龍叔和大家一起繼續加油。
2020剛開始就非常的不順利,剛過去的這一個月,好像所有的事情都告訴我們,還是要珍惜當下,珍惜眼前人,不管發生多少難過的事情,我們還是要繼續努力向前看,向前走。
話不多說,接著我們的密碼學系列開講,之前和大家討論了資訊保安的威脅,接下開始我們的密碼學第一課——流密碼,它是以最小單位位元作為一次加密、解密的操作元素,利用加密演算法進行加密與解密。流密碼的基本思想是利用金鑰 k 產生一個金鑰流 z ,並利用相應的規則對明文串 x進行加密,所得到的密文為: y 。
而流密碼與所謂的分組密碼最大的差距除了對於明文的處理方式不同以外,還有其加密器中是否含有記憶元件,流密碼的加密器中存在記憶元件,而分組密碼不存在,也正是由於這個記憶元件,我們可以進一步將流密碼分為同步流密碼和自同步流密碼。
同步流密碼:
是不是聽起來有點複雜,但其實它取決於加密器中記憶元件的儲存狀態,獨立於明文字元的叫做同步流密碼,否則叫做自同步流密碼, 但其實對於自同步流密碼來說,它的金鑰流的產生與輸入的明文有關, 所以在理論上我們很難能夠去分析清楚。而目前,我們在流密碼方面的所有科研成果絕大多數都是關於同步流密碼的。
同步流密碼的加密過程都與明文無關,故我們得到的密文也與明文直接聯絡。所以,通常情況下我們將同步流密碼的加密器分成金鑰流產生器和加密變換器兩個部分。在下圖所表示的就是流密碼的加密和解密流程。
我們輸入明文x,利用金鑰流生成器生成的金鑰z,利用加密演算法E對明文x進行加密。可以得到密文y。
反過來說,當我們已知密文y時,利用金鑰z和解密演算法D解析密文y,就可以得到明文x。
同步流密碼的加密演算法E可以是各種各樣的,但是我們必須保證變換是可逆的(也就是說通過明文利用加密演算法可以得到密文,反過來利用密文和解密演算法就可以得到明文)。
實際使用的數字保密通訊系統一般都是二元系統,所以說,在有限域 GF(2)上討論的二元加法流密碼是目前最為常用的流密碼體制。
其實通過這兩幅圖我們可以對比出來,在二元域中,二元加法流密碼就是將我們的加密演算法換成了所謂的二元域上的加法。(相信學計算機的我們一定對這個不陌生吧!hhhh~)
線性反饋移位暫存器LFSR:
線性反饋移位暫存器(LFSR):通常由移位暫存器和異或門邏輯組成。其主要應用在:偽隨機數,偽噪聲序列,計數器,BIST,資料的加密和CRC校驗等。在這裡我們主要說LFSR在密碼學中的應用,尤其是在流密碼中,線性反饋移位暫存器是組成金鑰流生成器的一個重要部分。
GF(2 )上一個 n 級反饋移位暫存器由 n 個二元儲存器與一個反饋函式 f ( a1 , a2 ,…, an )組成。話不多說,我們直接看圖。
圖中可以看到每一儲存器稱為移位暫存器的一級,在任一時刻,這些級的內容構成該反饋移位暫存器的狀態,每一狀態對應於GF(2)上的一個 n 維向量,共有2n種可能的狀態。每一時刻的狀態可用 n 長序列 a1 , a2 ,…, an表示, 其中 ai 是第 i 級儲存器的內容。
初始狀態由使用者確定,當第 i 個移位時鐘脈衝到來時,每一級儲存器 ai 都將其內容向下一級 ai - 1 傳遞, 並根據暫存器此時的狀態 a1 , a2 , …, an 計算 f ( a1 , a2 , …, an ) ,作為下一時刻的 an。
反饋函式 f ( a1 , a2 , …, an ) 是 n 元布林函 , 即 n 個變元 a1 , a2 ,…, an 可以獨立地取 0 和 1 這兩個可能的值, 函式中的運算有邏輯 與、邏輯或、邏輯補等運算,最後的函式值也為 0 或 1。
線性反饋移位暫存器輸出序列的性質完全由其反饋函式決定。 n 級線性反饋移位暫存器最多有 2的n次方個不同的狀態。若其初始狀態為 0,則其狀態恆為 0。若其初始狀態非 0,則其後邊的狀態也不會為 0。因此 n 級線性反饋移位暫存器的狀態週期小於等於 2的n次方- 1。其輸出序列的週期與狀態週期相等, 也小於等於 2的n次方- 1。只要選擇合適的反饋函式便可使 序列的週期達到最大值 2的n次方- 1,週期達到最大值的序列稱為 m 序列。
m序列:
m序列也就是最長線性移位暫存器序列的簡稱,是由線性反饋的移存器產生的週期最長的序列,也是一種偽隨機序列。
什麼是偽隨機序列?
偽隨機序列也就是,即使截獲其中一段,也無法推測後面是什麼。如果說金鑰流是週期的, 要完全做到隨機性是困難的。嚴格地說, 這樣的序列不可能做到隨機, 只能要求截獲比周期短的一段金鑰流時不會洩露更多資訊, 這樣的序列稱為偽隨機序列。
m序列的性質:
- 均衡性:
由m序列的一個週期中,一般情況下,0和1的數目基本相等或者1的數目比0的數目多一個。
例如0111101101001100000111001010101看出:總共有16個1和15個0。
- 遊程分佈:
m序列中取值相同的那些相繼的元素合稱為一個“遊程”。遊程中元素的個數稱為遊程長度。
n級的m序列中,總共有2n-1個遊程,其中長度為1的遊程佔總遊程數的1/2,長度為2的遊程佔總遊程數的1/4,長度為k的遊程佔總遊程數的2k。且長度為k的遊程中,連0與連1的遊程數各佔一半。
如序列0111101101001100000111001010101中,遊程總數為18-1=17,此序列各種長度的遊程分佈如下:
長度為1的遊程數目為10,其中5個1遊程和5個0遊程;
長度為2的遊程數目為4,2個11遊程,2個00遊程;
長度為3的連1遊程數目為1;
長度為4的連0遊程數目為1;
長度為5的連1遊程數目為1。
移位相加特性
一個m序列m1,m序列經任意延遲移位產生的另一序列m2,將m1與m2進行模2加運算,所得到的序列仍是m1的某次延遲移位序列 m3,並且m3等於m1與m2 異或。相關特性
我們可以根據移位相加特性來驗證m序列的自相關特性。因為移位相加後得到的還是m序列,因此0的個數比1的個數少1。
Golomb 公設:
由m序列的性質,我們可以驗證Golomb 對偽隨機週期序列提出了應滿足的如下3 個隨機性公設,具體如下:
① 在序列的一個週期內, 0 與 1 的個數相差至多為 1。
- 公設①說明{ ai}中 0 與 1 出現的概率基本上相同
② 在序列的一個週期內,長為 i 的遊程佔遊程總數的2的n次方分之1 ( i = 1, 2 ,… ),且在等長的遊程中 0 的遊程個數和 1 的遊程個數相等。
- 公設②說明 0 與 1 在序列中每一位置 上出現的概率相同。
③ 異相自相關函式是一個常數。
③ 異相自相關函式是一個常數。
- 公設③意味著通過對序列與其平移後的序列做比較, 不能給出其他任何資訊。
關於流密碼呢,當然還有一些非線性序列,但是非線性序列的生成也是以線性序列為基礎的,非線性序列生成器也是以LFSR為基礎的,一般來說,非線性序列生成器都需要多個LFSR 來驅動,這個的應用就相當的少了,大致瞭解就好。
最後的最後,龍叔還是要嘮嘮叨叨的提醒大家,注意安全,戴口罩,勤洗手,平安健康。
密碼學熱門文章:
聊聊密碼學中的DES演算法
懂點密碼學
資訊保安威脅