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码的二进制形式然后与随机密钥流进行异或运算,并输出结果
八、源代码
#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;
}