• 大小: 3KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: C/C++
  • 标签: 密码学  

资源简介

1)利用C\C++语言实现给定的LFSR;
2)通过不同初始状态生成相应的序列,并观察它们的周期有什么特点;
3)利用生成的序列对文本进行加/解密(按对应位作模2加运算)。
步骤:
(1)生成序列:使用#include库构造序列,使用bint.to_string()将输入的01串转成字符串,用str暂存。将bint[3]和bint[0]异或,赋值给bint[4]也就是a5,循环左移,将bint转成字符串后s1[4]就是生成的a1,将 a1添加到s2后面。当str与现在的bint相同,即周期结束,跳出循环,s2就是生成的完整序列。
(2)加密过程:生成31位序列后,读取待加密文本的每一个字符,和0XFF相与得到8位01串,依次与31位序列按位异或,结果得到8位01串,得到密文,写入ciphertext.txt。
(3)解密过程:每次读入ciphertext.txt中的8个01字符,将其再依次与31位序列按位异或,得到加密前的01串,根据这个01字符串,先转成bitset类型,再转成char型,将每个字母写入解密文件deciphertext.txt,解密结束。

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
#include 
#define n 5
using namespace std;

int main()
{
system(“title = LFSR“);
bitset bint;
    cout << “输入初始序列:“ << endl;
    cin >> bint;
string s1s2; //s1是bint转化后的字符串,s2是生成的01序列 
string str = bint.to_string(); //bint转成01字符串 
cout << “初始序列是:“<
do
{
int j = bint[3] ^ bint[0]; //a1和a4异或
//转化为字符串s1
s1 = bint.to_string();
//s1[4]是a1,将a1作为输出序列给s2
s2.push_back(s1[4]);
bint.operator>>=(1);//循环左移一位
//异或的结果给a5
bint[n - 1] = j;
cout << bint.to_string() << endl;
}while (str != bint.to_string());
cout << “输出序列:“ </*------------------------------------------------------------*/
//加密过程
fstream plain;
fstream enc(“ciphertext.txt“);
fstream dec(“deciphertext.txt“);
plain.open(“plaintext.txt“ios::in);
char chch2=0;
string tmp;
int mp = 0;
if(!plain)
{
cout<<“原始文件打开失败!“< exit(0); 
}
cout<<“原始文件打开成功!“< cout<<“下面开始读取文件!\n“;
plain.get(ch);
cout<<“ch:“<
int j = 0;
bool tt2; //t获取s2[j%31]的字符,将其转成布尔类型,t2记录m & (0x80),也就是m的最高位
while(!plain.eof())
{
//将ch转成8位01串m,依次将m的每一位与序列的一位相与,结果加到tmp中
m = ch & 0xFF;
for(int i = 0;i < 8;i++)
{
if(s2[j%31] == ‘1‘) //t暂存即将作为密钥异或的数字 
{
t = 1;
}
els

评论

共有 条评论