流密码应用-现代密码学第二章

流密码应用

现代密码学(第四版)第二章 流密码解答

(内心OS:太强大了)

再次更新:原文中些许错误,笔者已经修改了部分答案…
第二次更新:发现有些题和现代密码学第四版的题号对上,一些数字和运算符号改动了,但是方法都正确

1 例 2-3

已知线性反馈移位寄存器的初始状态为 {1,0,0,1,1},转移函数为 f(a1,a2,a3,a4,a5)=a1⊕a4,求输出状态和周期。
程序法:

#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;
}

输出结果
特征多项式法:
其特征多项式为 p(x)=x4+x+1,其输出序列的递推关系为 ak=ak−2⊕ak−5,k>=5
则可以轻松得到输出序列 1001101001000010101110110001111。
相比之下这种方法比较简单。

2 习题 2.1

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

3 习题 2.4

设密钥流是由 m=2s 级 LFSR 产生,其前 m+2 个比特是 (01)s+1,即 s+1 个 01。问第 m+3 个比特有无可能是 1,为什么?
解:
由题知该 LFSR 状态转移图为

f101
s01-
s1-0
f201
s0s1-
s1-s0

输出序列的周期为 2,输出序列为 01 的循环,且第 m+2 个比特为 1 ,由状态转移方程得第 m+3 个比特为 0,不可能为 1。

4 习题 2.5

设密钥流是由 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

5 习题 2.6

已知流密码的密文串 1010110110 和明文串 0100010001 ,而且已知密钥流是使用三级线性反馈移位寄存器产生的,试破译该密码系统。
在这里插入图片描述
在这里插入图片描述

6 习题 2.7

若 GF(2) 上的二元加法流密码的密钥生成器是 n 级线性反馈移位寄存器,产生的密钥是 m 序列。2.5 节已知,敌手若是知道一段长为 2n 的明密文对就可破译密钥流产生器。如果敌手仅仅知道长为 2n−2 的明密文对,问如何破译密钥流生成器。

解:敌手对于未知的 2n−1,2n 穷举可能的情况为 {00,01,10,11} ,对 4 种情况逐一尝试,即可破译。

7 习题 2.8

设 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<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;
}
8 习题 2.9

设基本钟控序列产生器钟 {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<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;
}
9

设 n 级线性反馈移位寄存器的特征多项式为 p(x),初始状态为 (a1,a2,⋯,an)=(00⋯01),证明输出序列的周期等于 p(x) 的阶
**加粗样式**

10

在这里插入图片描述
转载自 博客园shylocks

  • 18
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值