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

评论