📄 00des_main.h
字号:
#ifndef DES_MAIN_INCLUDED_
#define DES_MAIN_INCLUDED_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "DESTables.h"
/*
char keyHex[17]={0};
char cTextHex[17]={0};
bool mTextBit[64];
bool cTextBit[64];
bool keyBit[64];
*/
char mTextChar[9]={0};
//16个子密钥
static bool SubKey[16][48];
static bool Tmp[255];
void Transform(bool *Out, bool *In,const int *Table, int len)
{
int i;
for(i=0; i<len; ++i)
Tmp[i] = In[Table[i]-1];
memcpy(Out, Tmp, len);
}
void RotateL(bool *In, int len, int loop)
{
memcpy(Tmp, In, loop);
memcpy(In, In+loop, len-loop);
memcpy(In+len-loop, Tmp, loop);
}
void CreateSubKey(bool *Key)
{
bool Key2[56];
bool *KL=&Key2[0];
bool *KR=&Key2[28];
int i;
Transform(Key2, Key, PC1_Table, 56);
for(i=0; i<16; ++i) {
RotateL(KL, 28, LeftShift_Table[i]);
RotateL(KR, 28, LeftShift_Table[i]);
Transform(SubKey[i],Key2,PC2_Table,48);
}
}
bool weakkey(bool SubKey[16][48]){
int i,j;
bool FLAG=FALSE;
for(i=0;i<15;i++)
{
for(j=0;j<48;)
if(SubKey[i][j]!=SubKey[i+1][j])
{
FLAG=TRUE;
break; }
else j++;
}
return FLAG;
}
//字符转化为二进制
void CharToBit(char *in,bool *out,int LengthOfBit)
{
int i;
for(i=0;i<LengthOfBit;i++)
out[i]=(in[i/8]>>(i%8))&0x01;
}
//二进制转化为字符
void BitToChar(bool *in,char *out,int LengthOfBit)
{
int i;
for(i=0;i<LengthOfBit;i++)
out[i/8]|=(in[i]<<(i%8));
}
//二进制转化为十六进制
void BitToHex(bool *input,char *output)
{
int i;
for(i=0;i<16;i++){
char c;
int x;
x=input[i*4]+input[i*4+1]*2+input[i*4+2]*4+input[i*4+3]*8;
if(x<10)
c='0'+x;
else
c='A'+x-10;
if(i%2)
output[i-1]=c;
else
output[i+1]=c;
}
}
//十六进制转化为二进制
void HexToBit(char *input,bool *output)
{
int i;
for(i=0;i<16;i++){
int x;
if(input[i]>='A'&&input[i]<='F')
x=input[i]-'A'+10;
else
if(input[i]>='a'&&input[i]<='f')
x=input[i]-'a'+10;
else{
x=input[i]-'0';
}
if(i%2){
output[(i-1)*4]=x&0x01;
output[(i-1)*4+1]=(x>>1)&0x01;
output[(i-1)*4+2]=(x>>2)&0x01;
output[(i-1)*4+3]=(x>>3)&0x01;
}
else{
output[(i+1)*4]=x&0x01;
output[(i+1)*4+1]=(x>>1)&0x01;
output[(i+1)*4+2]=(x>>2)&0x01;
output[(i+1)*4+3]=(x>>3)&0x01;
}
}
}
//异或运算
void Xor(bool *InA, bool *InB)
{ int i;
for(i=0; i<32; ++i)
InA[i] =InA[i]^InB[i];
}
void Function_f(bool *r_in,bool *r_out,int order)
{
bool r_tmp[48],r_tmp2[32];
int i;
//E扩展
Transform(r_tmp,r_in,E_Table,48);
//和内部密钥做异或运算
Xor(r_tmp,SubKey[order]);
for(i=0;i<8;i++){
bool tmp[6];
int j;
int row,column;
int n;
for(j=0;j<6;j++)
tmp[j]=r_tmp[i*6+j];
row=tmp[0]*2+tmp[5];
column=tmp[1]*8+tmp[2]*4+tmp[3]*2+tmp[4];
n=S_Box[i][row][column];
//十进制n转化为二进制并存放r_tmp2
r_tmp2[i*4]=n&0x01;
r_tmp2[i*4+1]=(n>>1)&0x01;
r_tmp2[i*4+2]=(n>>2)&0x01;
r_tmp2[i*4+3]=(n>>3)&0x01;
}
//P置换
Transform(r_out,r_tmp2,P_Table,32);
}
//加密/解密过程
void Run(bool *input,bool *output,int FLAG)
{
int order[16];
int i;
bool tmp[64];
bool result_f[32];
bool L_tmp[32];
if(FLAG==1)
{
for(i=0;i<16;i++)
order[i]=i;
}
else
{
for(i=0;i<16;i++)
order[i]=15-i;
}
memcpy(tmp, input, 64);
//IP置换
Transform(tmp,tmp,IP_Table,64);
bool *L=&tmp[0];
bool *R=&tmp[32];
//16圈加密过程
for(i=0;i<16;i++){
memcpy(L_tmp, R, 32);
Function_f(R,result_f,order[i]);//f函数
Xor(L,result_f);//异或运算
memcpy(R,L, 32);
memcpy(L,L_tmp, 32);
}
memcpy(output,R,32);
memcpy(output+32,L,32);
//IP逆置换
Transform(output,output,IPR_Table,64);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -