#include <iostream>
#include <vector>
#include <bitset>
#include <ctime>
#include <cmath>
using namespace std;
char s1[19]={'/0'};//t时刻移位寄存器一的状态
char s2[22]={'/0'};//t时刻移位寄存器二的状态
char s3[23]={'/0'};//t时刻移位寄存器三的状态
char state[3]={s1[9],s2[10],s3[11]};//步进控制信号
void initialkey()//初始化移位寄存器(从文件读取初始状态)
{
FILE *pFile;
pFile = fopen ( "initialkey.txt" , "r" );
if(pFile==NULL)
{
cout<<"Can not open the file!"<<endl;
return;
}
fgets(s1,20,pFile);
fseek ( pFile , 2 , SEEK_CUR );
fgets(s2,23,pFile);
fseek ( pFile , 2 , SEEK_CUR );
fgets(s3,24,pFile);
fclose ( pFile );
}
void f1()//移位寄存器1
{
memmove(s1,s1+1,18);
s1[18]=s1[0]^s1[13]^s1[16]^s1[17]^s1[18];
}
void f2()//移位寄存器2
{
memmove(s2,s2+1,21);
s2[21]=s2[0]^s2[20]^s2[21];
}
void f3()//移位寄存器3
{
memmove(s3,s3+1,22);
s3[22]=s3[0]^s3[7]^s3[20]^s3[21]^s3[22];
}
bool isequal()//判断三个步进信号是否相等
{
if(state[0]==state[1] && state[0]==state[2])
return true;
else
return false;
}
short control()//钟控
{
if(isequal())
{
f1();
f2();
f3();
return s1[0]^s2[0]^s3[0];
}
else
{
if(state[0]==state[1])
{
f1();
f2();
return s1[0]^s2[0];
}
if(state[0]==state[2])
{
f1();
f3();
return s1[0]^s3[0];
}
if(state[1]==state[2])
{
f2();
f3();
return s2[0]^s3[0];
}
}
return 0;
}
int main()
{
vector<short> v;//向量v用来存储扩展的密钥流
initialkey();//初始化移位寄存器
cout<<"移位寄存器初始状态"<<endl;
cout<<s1<<endl;
cout<<s2<<endl;
cout<<s3<<endl;
clock_t start,finish;//测试时间
double duration;
FILE *fp1;
FILE *fp2;
char FILENAME[50],ENNAME[100]="加密_",DECRYNAME[100]="解密_";
//加密
printf("请输入明文文件:/n");
gets(FILENAME);
if((fp1=fopen(FILENAME,"rb"))==NULL)
{
printf("Can not open the file! /n");
exit(0);
}
strcat(ENNAME,FILENAME);
if((fp2=fopen(ENNAME,"wb+"))==NULL)
{
printf("Can not set a new file!/n");
exit(0);
}
short jiami;
short ch;
short miyue;
printf("加密中.../n");
start = clock();
short temp=0;
int ii=0;
short sum=0;
while(!feof(fp1))//读取文件并加密
{
sum=0;
ch=fgetc(fp1);
for(ii=0;ii<8;ii++)
{
temp = control()-'0';
sum += pow(2.0*temp,ii);
}
v.push_back(sum);
fputc(sum^ch,fp2);
}//while
finish = clock();
fclose(fp1);
fclose(fp2);
duration = (double)(finish-start)/CLOCKS_PER_SEC;
printf("加密共用:%f秒/n",duration);
printf("/n加密后文件为: %s /n",ENNAME);
printf("需要解密吗y/n?/n");
char c=getchar();
{
if(c=='y'||c=='Y')
NULL;
else
return 0;
}
/*************************************************/
//解密
strcat(DECRYNAME,FILENAME);
if((fp1=fopen(ENNAME,"rb"))==NULL)
{
printf("Can not open the file! /n");
exit(0);
}
if((fp2=fopen(DECRYNAME,"wb+"))==NULL)
{
printf("Can not set a new file!/n");
exit(0);
}
vector<short>::iterator it(v.begin());//使用迭代器it访问v中的元素
short jiemi;
start = clock();
printf("解密中.../n");
char cc;
while(!feof(fp1))
{
cc=fgetc(fp1);
jiemi=cc^(*it);
it++;
fputc(jiemi,fp2);
}
finish = clock();
duration = (double)(finish-start)/CLOCKS_PER_SEC;
printf("解密共用:%f秒/n",duration);
printf("/n解密后文件为: %s /n",DECRYNAME);
fclose(fp1);
fclose(fp2);
/*************************************************/
return 0;
}