(内心OS:太强大了)
再次更新:原文中些许错误,笔者已经修改了部分答案…
第二次更新:发现有些题和现代密码学第四版的题号对上,一些数字和运算符号改动了,但是方法都正确
已知线性反馈移位寄存器的初始状态为 {1,0,0,1,1},转移函数为 f(a1,a2,a3,a4,a5)=a1⊕a4,求输出状态和周期。
程序法:
#include
#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;
}
特征多项式法:
其特征多项式为 p(x)=x4+x+1,其输出序列的递推关系为 ak=ak−2⊕ak−5,k>=5
则可以轻松得到输出序列 1001101001000010101110110001111。
相比之下这种方法比较简单。
3级线性反馈寄存器在c3=1时可有 4 种线性反馈函数,设其初始状态 {a1,a2,a3}=(1,0,1),求各线性反馈寄存器的输出序列及周期。
解:其特征多项式可能为 p(x)=x+1、p(x)=x3+x+1、p(x)=x2+x+1、p(x)=x3+x2+x+1,
依次讨论:
当 p(x)=x+1时 ak=ak−3 输出序列:101101… p=3
当 p(x)=x3+x+1时 ak=ak−1⊕ak−3输出序列:10100111010011… p=7
当 p(x)=x2+x+1时 ak=ak−2⊕ak−3输出序列:10111001011100… p=7
当 p(x)=x3+x2+x+1时 ak=ak−1⊕ak−2⊕ak−3输出序列:1010… p=2
设密钥流是由 m=2s 级 LFSR 产生,其前 m+2 个比特是 (01)s+1,即 s+1 个 01。问第 m+3 个比特有无可能是 1,为什么?
解:
由题知该 LFSR 状态转移图为
f1 | 0 | 1 |
---|---|---|
s0 | 1 | - |
– | – | – |
s1 | - | 0 |
f2 | 0 | 1 |
---|---|---|
s0 | s1 | - |
– | – | – |
s1 | - | s0 |
输出序列的周期为 2,输出序列为 01 的循环,且第 m+2 个比特为 1 ,由状态转移方程得第 m+3 个比特为 0,不可能为 1。
设密钥流是由 n 级 LFSR 产生,其周期为 2n−1,i 是任一正整数,在密钥流中考虑一下比特对:
(Si,Si+1),(Si+1,Si+2),⋯,(Si+2n−3,Si+2n−2),(Si+2n−2,Si+2n−1)
问有多少形如 (Si,Si+1)=(1,1) 的比特对?证明你的结论。
解:
共 ((i+2n−2)−(i))/2=(2n−1−1) 对比特对,包含的比特位总数 =2n−1 ,为 1 周期
假设前 2n−2−1 对比特对均为形如 (Si,Si+1)=(0,0) 的比特对,由定理 2-7 可得,1 出现的次数为 2n−1−0出现的次数=2n−1,即剩下的比特对均为形如
(Si,Si+1)=(1,1) 的比特对,即答案为 2n−2。
下面证明一般性:
由定理 2-7-(2) 可得,长为 i 的游程有 2n−i−1/2 个,且 0、1 各半,长为 n 的 1 游程一个而长为 i 的 1 游程,可组成 i−1 个形如 (Si,Si+1)=(1,1) 的比特对。
N=∑n−2i=22n−i−1/2∗(i−1)+n=2n−2
已知流密码的密文串 1010110110 和明文串 0100010001 ,而且已知密钥流是使用三级线性反馈移位寄存器产生的,试破译该密码系统。
若 GF(2) 上的二元加法流密码的密钥生成器是 n 级线性反馈移位寄存器,产生的密钥是 m 序列。2.5 节已知,敌手若是知道一段长为 2n 的明密文对就可破译密钥流产生器。如果敌手仅仅知道长为 2n−2 的明密文对,问如何破译密钥流生成器。
解:敌手对于未知的 2n−1,2n 穷举可能的情况为 {00,01,10,11} ,对 4 种情况逐一尝试,即可破译。
设 JK 触发器中 {ak} 和 {bk} 分别为 3 级和 4 级 m 序列密,且
{ak}=11101001110100⋯
{bk}=001011011011000001011011011000⋯
求输出序列 {ck} 及周期。
解
gcd(3,4)=1,周期p=(23−1)∗(24−1)=7∗15=105
由JK触发器的表达式
ck={aknot bkif ck−1=0if ck−1=1
令 c−1=0 输出序列为:{110010010101111110100101100011110001100100111110010101101111110101100010111110100100101111110101101100111}
C++ 实现 JK 触发器:
#include
#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;
}
设基本钟控序列产生器钟 {ak} 和 {bk} 分别为 2 级和 3 级 m 序列,且
{ak}=10101⋯
{bk}=10011011001101⋯
求输出序列 {ck} 及周期。
解:
序列 {ak} 的周期为 3,序列 {bk} 的周期为 7,则序列 {ck} 的周期为 3∗7=21
j=0ck={ck−1b++jif ak=0if ak=1
输出序列为:100011100111000111011
C++实现:
#include
#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;
}
设 n 级线性反馈移位寄存器的特征多项式为 p(x),初始状态为 (a1,a2,⋯,an)=(00⋯01),证明输出序列的周期等于 p(x) 的阶