流密碼應用


1 例 2-3

已知線性反饋移位寄存器的初始狀態為 \(\{1,0,0,1,1\}\),轉移函數為 \(f(a_1,a_2,a_3,a_4,a_5)=a_1\oplus a_4\),求輸出狀態和周期。

1.1 圖標法

畫表:

\(a_1\) \(a_2\) \(a_3\) \(a_4\) \(a_5\) \(f\)
1 0 0 1 1 0
0 0 1 1 0 1
0 1 1 0 1 0
1 1 0 1 0 0
1 0 1 0 0 1
0 1 0 0 1 0
1 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 0
1 0 0 0 0 1
0 0 0 0 1 0
0 0 0 1 0 1
0 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 1
0 1 0 1 1 1
1 0 1 1 1 0
0 1 1 1 0 1
1 1 1 0 1 1
1 1 0 1 1 0
1 0 1 1 0 0
0 1 1 0 0 0
1 1 0 0 0 1
1 0 0 0 1 1
0 0 0 1 1 1
0 0 1 1 1 1
0 1 1 1 1 1
1 1 1 1 1 0
1 1 1 1 0 0
1 1 1 0 0 1
1 1 0 0 1 1

周期為 31,輸出序列為 1001101001000010101110110001111。

1.2 程序法

#include<bits/stdc++.h>
#define n 5
using namespace std;
int main()
{
	bitset<n>bint(19);
	bitset<n>str(bint);
	string s1;
	cout << "初始狀態為:"<<bint.to_string() << endl;
	int co=0;
	do
	{
		s1 += bint[4]+'0';
		int j = bint[4] ^ bint[1];
		bint.operator<<=(1);
		bint[0] = j;
		co++;
	} 
	while (str.to_string() != bint.to_string());
	cout<<"輸出序列為:"<<s1<<endl;
	cout<<"周期為:"<<co<<endl;
	return 0;
}

運行結果:

1.3 特征多項式法

其特征多項式為 \(p(x)=x^4+x+1\),其輸出序列的遞推關系為 \(a_k=a_{k-2}\oplus a_{k-5},k>=5\)
則可以輕松得到輸出序列 1001101001000010101110110001111。
相比之下這種方法比較簡單。

2 習題 2.1

3級線性反饋寄存器在\(c_3=1\)時可有 4 種線性反饋函數,設其初始狀態 \(\{a_1,a_2,a_3\}=(1,0,1)\),求各線性反饋寄存器的輸出序列及周期。
解:其特征多項式可能為 \(p(x)=x+1\)\(p(x)=x^3+x+1\)\(p(x)=x^2+x+1\)\(p(x)=x^3+x^2+x+1\),依次討論:

\[當\ p(x)=x+1時\ a_k=a_{k-3} \\ 輸出序列:101101 \dots \ p=3 \\ 當\ p(x)=x^3+x+1時\ a_k=a_{k-1}\oplus a_{k-3} \\ 輸出序列:10100111010011\dots \ p=7 \\ 當\ p(x)=x^2+x+1時\ a_k=a_{k-2}\oplus a_{k-3} \\ 輸出序列:10111001011100\dots \ p=7 \\ 當\ p(x)=x^3+x^2+x+1時\ a_k=a_{k-1}\oplus a_{k-2}\oplus a_{k-3} \\ 輸出序列:1010\dots \ p=2 \]

3 習題 2.3

\(n=4,f(a_1,a_2,a_3,a_4)=a_1\oplus a_2\oplus a_3\oplus a_4\),初始狀態為 \((a_1,a_2,a_3,a_4)=(1,1,0,1)\),求此非線性反饋移位寄存器的輸出序列及周期。
解:

\(a_1\) \(a_2\) \(a_3\) \(a_4\) \(f\)
1 1 0 1 1
1 0 1 1 1
0 1 1 1 0
1 1 1 0 1
1 1 0 1 1

輸出序列為 11011101……,周期為 4。

4 習題 2.4

設密鑰流是由 \(m=2s\) 級 LFSR 產生,其前 \(m+2\) 個比特是 \((01)^{s+1}\),即 \(s+1\)\(01\)。問第 \(m+3\) 個比特有無可能是 \(1\),為什么?
解:
由題知該 LFSR 狀態轉移圖為

\(f_1\) \(0\) \(1\)
\(s_0\) 1 -
\(s_1\) - 0
\(f_2\) \(0\) \(1\)
\(s_0\) \(s_1\) -
\(s_1\) - \(s_0\)

輸出序列的周期為 2,輸出序列為 01 的循環,且第 \(m+2\) 個比特為 1 ,由狀態轉移方程得第 \(m+3\) 個比特為 0,不可能為 1。

5 習題 2.5

設密鑰流是由 n 級 LFSR 產生,其周期為 \(2^n-1\)\(i\) 是任一正整數,在密鑰流中考慮一下比特對:
\((S_{i},S_{i+1}),(S_{i+1},S_{i+2}),\cdots ,(S_{i+2^n-3},S_{i+2^n-2}),(S_{i+2^n-2},S_{i+2^n-1})\)
問有多少形如 \((S_{i},S_{i+1})=(1,1)\) 的比特對?證明你的結論。

解:
\(((i+2^n-2)-(i))/2=(2^{n-1}-1)\) 對比特對,包含的比特位總數 \(=2^n-1\) ,為 1 周期
假設前 \(2^{n-2}-1\) 對比特對均為形如 \((S_{i},S_{i+1})=(0,0)\) 的比特對,由定理 2-7 可得,\({1}\) 出現的次數為 $ 2^n-1\ -\ {0出現的次數} = 2^{n-1}$,即剩下的比特對均為形如
\((S_{i},S_{i+1})=(1,1)\) 的比特對,即答案為 \(2^{n-2}\)
下面證明一般性:
由定理 2-7-(2) 可得,長為 \(i\) 的游程有 \(2^{n-i-1}/2\) 個,且 \(0、1\) 各半,長為 \(n\)\(1\) 游程一個而長為 \(i\)\(1\) 游程,可組成 \(i-1\) 個形如 \((S_{i},S_{i+1})=(1,1)\) 的比特對。
\(N=\sum_{i=2}^{n-2}2^{n-i-1}/2*(i-1)+n=2^{n-2}\)

6 習題 2.6

已知流密碼的密文串 \(1010110110\) 和明文串 \(0100010001\) ,而且已知密鑰流是使用三級線性反饋移位寄存器產生的,試破譯該密碼系統。

解:參考例 2-6 ,將密文串與明文串異或運算得到密鑰流 \(1110100111\) ,取密文串與明文串前六個字符建立如下方程

\[(a_4a_5a_6)=(c_3c_2c_1)* \begin{bmatrix} {a_1} & {a_2} & {a_3}\\ {a_3} & {a_4} & {a_5}\\ {a_4} & {a_5} & {a_6} \end{bmatrix} \\ (010)=(c_3c_2c_1)* \begin{bmatrix} 1 & 1 & 1\\ 1 & 1 & 0\\ 1 & 0 & 1 \end{bmatrix}\\ 從而得到\\ (c_3c_2c_1)=(111) \begin{bmatrix} -1 & 1 & 1\\ 1 & 0 & -1\\ 1 & -1 & 0 \end{bmatrix}=(101)\\ 即a_k=a_{k-1}\oplus a_{k-3} \]

7 習題 2.7

若 GF(2) 上的二元加法流密碼的密鑰生成器是 n 級線性反饋移位寄存器,產生的密鑰是 m 序列。2.5 節已知,敵手若是知道一段長為 \(2n\) 的明密文對就可破譯密鑰流產生器。如果敵手僅僅知道長為 \(2n-2\) 的明密文對,問如何破譯密鑰流生成器。

解:敵手對於未知的 \(2n-1,2n\) 窮舉可能的情況為 \(\{00,01,10,11\}\) ,對 4 種情況逐一嘗試,即可破譯。

8 習題 2.8

設 JK 觸發器中 \(\{a_k\}\)\(\{b_k\}\) 分別為 3 級和 4 級 m 序列密,且

\[\{a_k\}=11101001110100\cdots\\ \{b_k\}=001011011011000001011011011000\cdots\\ \]

求輸出序列 \(\{c_k\}\) 及周期。


\(gcd(3,4)=1,周期 p=(2^3-1)*(2^4-1)=7*15=105\)
由JK觸發器的表達式

\[c_k = \begin{cases} {a_k} &\text{if } {c_{k-1}=0} \\ {not\ b_k} &\text{if } {c_{k-1}=1} \end{cases} \]

\(c_{-1}=0\) 輸出序列為:{110010010101111110100101100011110001100100111110010101101111110101100010111110100100101111110101101100111}
C++ 實現 JK 觸發器:

#include<bits/stdc++.h>
#define N 105 
using namespace std;
int main(){
	string a="1110100";
	string b="001011011011000"; 
	while(a.size()<=N)a+=a;
	while(b.size()<=N)b+=b;
	int tmp=a[0]-'0';
	cout<<tmp;
	for(int i=1;i<N;++i,tmp=tmp==0?a[i]-'0':b[i]=='0'?1:0)cout<<tmp;
	return 0;
}

p.s. JK觸發器好像在數電里學過……(望天)

9 習題 2.9

設基本鍾控序列產生器鍾 \(\{a_k\}\)\(\{b_k\}\) 分別為 2 級和 3 級 \(m\) 序列,且
\(\{a_k\}=10101\cdots\)
\(\{b_k\}=10011011001101\cdots\)
求輸出序列 \(\{c_k\}\) 及周期。

解:
序列 \(\{a_k\}\) 的周期為 3,序列 \(\{b_k\}\) 的周期為 7,則序列 \(\{c_k\}\) 的周期為 \(3*7=21\)

\[j=0\\ c_k = \begin{cases} {c_{k-1}} &\text{if } {a_{k}=0} \\ {b_{++j}} &\text{if } {a_{k}=1} \end{cases} \]

輸出序列為:100011100111000111011
C++實現:

#include<bits/stdc++.h>
#define N 21
using namespace std;
int main(){
	string a="101";
	string b="1001101"; 
	while(a.size()<=N+1)a+=a;
	while(b.size()<=N+1)b+=b;
	int j=0;
	int tmp=b[j]-'0';
	for(int i=0;i<N;++i){
		cout<<tmp;
		if(a[i]=='1')tmp=b[++j]-'0';
	}
	return 0;
}

10 習題 2.2

設 n 級線性反饋移位寄存器的特征多項式為 \(p(x)\),初始狀態為 \((a_1,a_2,\cdots ,a_n)=(00\cdots 01)\),證明輸出序列的周期等於 \(p(x)\) 的階

11



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM