#include "des.h"
#include "inter.h"
#include "util.h"
#include "compress.h"
void RawToMature(char * RawKey,int * MatureKey,int * KeyLeft,int * KeyRight,int * KeyA,int * KeyB)
{
int temp;
int buffer[64];
for(int i=0;i<8;i++)
{
temp = (int)RawKey[i];
DecToBin(temp,&MatureKey[i*8],8);
}
//64位密钥置换,去除第8,16,24,32,40,48,56,64校验位,生成56位密钥
for(int i=0;i<28;i++)
{
buffer[i] = MatureKey[KeyLeft[i]-1];
}
for(int i=0;i<28;i++)
{
buffer[i+28] = MatureKey[KeyRight[i]-1];
}
BufferCopy(KeyA,buffer,28);
BufferCopy(KeyB,&buffer[28],28);
}
void GenKey(int times,int * KeyA,int * KeyB,int * Rotate,int * KeyTemp,int * Diagram,int * KEY[])
{
KeyLeftShift(KeyA,Rotate[times]);
KeyLeftShift(KeyB,Rotate[times]);
BufferCopy(KeyTemp,KeyA,28);
BufferCopy(&KeyTemp[28],KeyB,28);
KEY[times] = (int *)malloc(48*sizeof(int));
printf("\nKEY[%2d]\n",times);
for(int i=0;i<48;i++)
{
KEY[times][i] = KeyTemp[Diagram[i]-1];
printf("%d",KEY[times][i]);
}
putchar('\n');
}
void DataProcess(unsigned char OldData[],int Temp64[],int Replacement[],int ExRight[],int * KEY[],Mode mode)
{
int temp;
int NewData[64],cipher[64],CipherTemp[64];
int Left[32],RightTemp[32],RightExtension[48],Right[32];
for(int i=0;i<8;i++)
{
temp = (int)OldData[i];
DecToBin(temp,&Temp64[i*8],8);
}
for(int i=0;i<64;i++)
{
NewData[i] = Temp64[Replacement[i]-1];
}
BufferCopy(Left,NewData,32);
BufferCopy(Right,&NewData[32],32);
switch(mode)
{
case Encryption:
for(int p=0;p<16;p++)
{
for(int i=0;i<48;i++)
{
RightExtension[i] = Right[ExRight[i]-1];
}
BufferCopy(RightTemp,Right,32);
for(int i=0;i<48;i++)
{
RightExtension[i] = RightExtension[i]^KEY[p][i];
}
SixToFour(Right,RightExtension,Compress1,Compress2,Compress3,Compress4,Compress5,Compress6,Compress7,Compress8);
for(int i=0;i<32;i++)
{
Right[i] = RightTemp[ReRight[i]-1];
}
for(int i=0;i<32;i++)
{
Right[i] = Left[i]^Right[i];
Left[i] = RightTemp[i];
}
}
break;
case Decryption:
for(int p=15;p>=0;p--)
{
for(int i=0;i<48;i++)
{
RightExtension[i] = Right[ExRight[i]-1];
}
BufferCopy(RightTemp,Right,32);
for(int i=0;i<48;i++)
{
RightExtension[i] = RightExtension[i]^KEY[p][i];
}
SixToFour(Right,RightExtension,Compress1,Compress2,Compress3,Compress4,Compress5,Compress6,Compress7,Compress8);
for(int i=0;i<32;i++)
{
Right[i] = RightTemp[ReRight[i]-1];
}
for(int i=0;i<32;i++)
{
Right[i] = Left[i]^Right[i];
Left[i] = RightTemp[i];
}
}
break;
default:
printf("Error!\n");
}
//将生成的密文存入cipher[64]中,然后转化为十进制存入文件
BufferCopy(cipher,Right,32);
BufferCopy(&cipher[32],Left,32);
BufferCopy(CipherTemp,cipher,64);
for(int i=0;i<64;i++)
{
cipher[i] = CipherTemp[Inverse[i]-1];
}
for(int i=0;i<=56;i=i+8)
{
temp = BinToDec(&cipher[i],8);
printf("%3d ",temp);
fputc((unsigned char)temp,pic_fp);
}
putchar('\n');
}
void DataPretreat(unsigned char OldData[],int * KEY[],Mode mode)
{
FILE * fp;
char ch;
int pos = 0,counter=0;
int len,rest,total;
char name[32];
printf("Input PICTURE File Name(.bmp):");
scanf("%s",name);
if((fp = fopen(name,"rb")) == NULL)
{
printf("Error!Can not open file!\n");
exit(0);
}
len = GetFileLen(fp);
total = len/8;
rest = len%8;
printf("LEN:%d,Total:%d,Rest:%d\n",len,total,rest);
fseek(fp,0,SEEK_SET);
if(mode == Encryption)
{
if((pic_fp = fopen("cipher.bmp","ab+")) == NULL)
{
printf("Error:Can not open file cipher.bmp");
}
}
else
{
if((pic_fp = fopen("plaint.bmp","ab+")) == NULL)
{
printf("Error:Can not open file cipher.bmp");
}
}
for(int i=0;i<54;i++)
{
ch = fgetc(fp);
fputc((unsigned char)ch,pic_fp);
}
while(total--)
{
pos = 0;
while((pos+1) % 9)
{
ch = fgetc(fp);
OldData[pos++] = (unsigned char)ch;
}
printf("Counter:%d\t",++counter);
DataProcess(OldData,Temp64,Replacement,ExRight,KEY,mode);
}
for(int i=0;i<rest;i++)
{
ch = fgetc(fp);
fputc((unsigned char)ch,pic_fp);
}
fclose(fp);
fclose(pic_fp);
}
void SixToFour(int Right[],int RightExtension[],int Compress1[][16],int Compress2[][16],int Compress3[][16],int Compress4[][16],int Compress5[][16],int Compress6[][16],int Compress7[][16],int Compress8[][16])
{
int row,column,temp,buffer[4],times=0,j=0;
int UnitTwo[2],UnitFour[4];
for(int i=0;i<=42;i=i+6)
{
times++;
StringCopy(UnitTwo,RightExtension,i,i);
StringCopy(&UnitTwo[1],RightExtension,i+5,i+5);
StringCopy(UnitFour,RightExtension,i+1,i+4);
row = BinToDec(UnitTwo,2);
column = BinToDec(UnitFour,4);
switch(times)
{
case 1:
temp = Compress1[row][column];
break;
case 2:
temp = Compress2[row][column];
break;
case 3:
temp = Compress3[row][column];
break;
case 4:
temp = Compress4[row][column];
break;
case 5:
temp = Compress5[row][column];
break;
case 6:
temp = Compress6[row][column];
break;
case 7:
temp = Compress7[row][column];
break;
default:
temp = Compress8[row][column];
break;
}
DecToBin(temp,buffer,4);
BufferCopy(&Right[j],buffer,4);
j=j+4;
}
}
DES.rar_DES .bmp_DES加密图片
版权申诉
![star](https://csdnimg.cn/release/downloadcmsfe/public/img/star.98a08eaa.png)
![avatar](https://profile-avatar.csdnimg.cn/dabc422b995e4f93b0df429caef6266e_weixin_42656416.jpg!1)
四散
- 粉丝: 54
- 资源: 1万+
最新资源
- Matlab与 Fortran的混合编程及其应用
- dafsbkljkfafsfsf
- 用Swift Palyground学习编程(初级)
- labview简易计算器,类似于windows自带的计算器 浙理工同学可以无脑下载
- Java编程思想笔记(全)
- 基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本121.0.6154.0)
- 基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本121.0.6150.0)
- 基于Python+opencv的多人脸检测,口罩佩戴检测,单目标跟踪
- 基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本121.0.6148.0)
- 基于C++版本的sort算法,可无缝添加在检测器后进行实时多目标跟踪
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)