A51加密

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值