2025年A51加密

A51加密include iostream include vector include bitset include ctime include cmath using namespace std char s1 19 0 t 时刻移位寄存器一的状态 char cmath ctime bitset vector iostream

大家好,我是讯享网,很高兴认识大家。

 

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

小讯
上一篇 2025-04-02 10:44
下一篇 2025-02-17 21:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/15498.html