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() {
int a[31]={1,1,0,0,1}; for(int k=5;k<31;++k) a[k]=(a[k-2]+a[k-5])%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; }
|