抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

LFSR流密码 实验

一、实验题目

LFSR流密码

二、实验目的和要求

编程实现简单地线性反馈移位寄存器,理解其工作原理,掌握流密码的算法结构和加解密过程。利用C++语言实现LFSR。通过不同初始状态生成相应序列,观察其周期特点。利用生成的序列对文本进行加密和解密运算。

三、实验环境

clion

四、实验内容

给定的 LFSR 结构如图,程序完成功能:

(1)由给定的初始状态序列生成密钥序列
(2)选择进行文件加密还是解密
(3)如果选择文件加密,则从 in.txt 中读取明文,用密钥流序列进行加密,密
文保存于 out.txt 中;如果选择文件解密,则从 out.txt 中读取密文,用密钥流序列进
行解密,密文保存于 in.txt 中。

五、算法描述及实验步骤

$$a_{n+t}=c_na_t\oplus c_{n-1}a_{t+1}\oplus….\oplus c_1a_{n+t-1},\ t=1,2,3..$$

该实验以五级为例,n=5,代入公式,根据图中的异或关系得到

$$a_{5+t}=a_t\oplus a_{3+t},t=1,2,…$$

根据该公式,生成密钥序列

$$a_6,a_7,a_8……….$$

流密码的操作原理,将明文划分为字符或编码的基本单元。每个字符八字节,每个字符分别与密钥流进行加密。例如把字符转换为ascii码的二进制形式然后与随机密钥流进行异或运算,并输出结果

消息流:

$$m=m_1m_2m_3……m_i\in M$$

加密过后:

$$c_i=E_k(m_i)$$

六、调试过程及结果(附截图)

七、总结体会

❓代码如何将数字化的明文与流密钥异或成密文?

‼️将明文划分为字符或编码的基本单元。每个字符八字节,每个字符分别与密钥流进行加密。例如把字符转换为ascii码的二进制形式然后与随机密钥流进行异或运算,并输出结果

八、源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<iostream>
#include<vector>
#include<cmath>
#include<fstream>
using namespace std;
int main()
{

/*下面是密钥的产生*/
//初始级数为5,周期为31
int a[31]={1,1,0,0,1}; //初始的激活序列
for(int k=5;k<31;++k)
a[k]=(a[k-2]+a[k-5])%2; //这一步是根据公式$a_{5+t}=a_t\oplus a_{3+t},t=1,2,... %2即:异或运算也是模2加法运算
cout<<"密钥如下:"<<endl;
for(int jj=0;jj<31;++jj)
cout<<a[jj]<<' ';
cout<<endl;
////////////////////////
int i=0,key;
cout<<"请选择操作方式:1-加密 2-解密"<<endl;
cin>>key;
vector<int>s,ss;
if(key==1||key==2)
{
if(key==1)
{
cout<<"加密成功,密文见out.txt"<<endl;
ifstream in("in.txt");
ofstream out("out.txt");
char c;
while(in>>c)
{
int sum=0;
int j;
for(j=0;j<8;++j)
sum+=pow((double)2,(double)(7-j))*a[(i+j)%31];
if(i+j>32)
i=(i+j-1)%31+1;
else
i=i+8;
s.push_back((int(c))^sum);

}
for(int kk=0;kk<s.size();++kk)
{
out<<char(s[kk]);
}

}
if(key==2)
{
cout<<"解密成功,明文见in.txt"<<endl;
ifstream in("out.txt");
ofstream out("in.txt");
char c;
while(in>>c)
{
int sum=0;
int j;
for(j=0;j<8;++j)
sum+=pow((double)2,(double)(7-j))*a[(i+j)%31];
if(i+j>32)
i=(i+j-1)%31+1;
else
i=i+8;
s.push_back((int(c))^sum);
}
for(int kk=0;kk<s.size();++kk)
out<<char(s[kk]);
}
}
else
cout<<"操作无效!"<<endl;
}

评论