📄 des_main.h
字号:
#ifndef DES_MAIN_INCLUDED_
#define DES_MAIN_INCLUDED_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "DESTables.h"
char mTextChar[9]={0};
//16个子密钥
static bool SubKey[16][48];
static bool temp[255];
//置换函数
void Replace(bool *output, bool *input,const int *Table, int length)
{
for(int i=0; i<length; ++i)
temp[i] = input[Table[i]-1];
memcpy(output, temp, length);
}
//生成密钥移位函数
void LS(bool *input, int length, int looptime)
{
memcpy(temp, input, looptime);
memcpy(input, input+looptime, length-looptime);
memcpy(input+length-looptime, temp, looptime);
}
//生成子密钥函数
void CreateSubKey(bool *Key)
{
bool Key2[56];
bool *KL=&Key2[0];
bool *KR=&Key2[28];
Replace(Key2, Key, PC1_Table, 56);
for(int i=0; i<16; ++i) {
LS(KL, 28, LS_Table[i]);
LS(KR, 28, LS_Table[i]);
Replace(SubKey[i],Key2,PC2_Table,48);
}
}
//弱密钥判断函数
bool weakkey(bool SubKey[16][48])
{
bool FLAG=FALSE;
for(int i=0;i<15;i++)
{
for(int j=0;j<48;)
if(SubKey[i][j]!=SubKey[i+1][j])
{
FLAG=TRUE;
return FLAG;
}
else j++;
}
return FLAG;
}
//字符转化为二进制
void CharToBit(char *in,bool *out,int Bits)
{
int i;
for(i=0;i<Bits;i++)
out[i]=(in[i/8]>>(i%8))&0x01;
}
//二进制转化为字符
void BitToChar(bool *in,char *out,int Bits)
{
int i;
for(i=0;i<Bits;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(bool *in,bool *out,int order)
{
bool E_temp[48],S_result[32];
int i;
//E扩展
Replace(E_temp,in,E_Table,48);
//和内部密钥做异或运算
Xor(E_temp,SubKey[order]);
for(i=0;i<8;i++){
bool S_temp[6];
int j;
int row,column;
int n;
for(j=0;j<6;j++)
S_temp[j]=E_temp[i*6+j];
row=S_temp[0]*2+S_temp[5];
column=S_temp[1]*8+S_temp[2]*4+S_temp[3]*2+S_temp[4];
n=S_Box[i][row][column];
//十进制n转化为二进制并存放S_result
S_result[i*4]=n&0x01;
S_result[i*4+1]=(n>>1)&0x01;
S_result[i*4+2]=(n>>2)&0x01;
S_result[i*4+3]=(n>>3)&0x01;
}
//P置换
Replace(out,S_result,P_Table,32);
}
//加密/解密过程
void Run(bool *input,bool *output,int FLAG)
{
int order[16];
int i;
bool temp[64];
bool temp_f[32];
bool L_temp[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(temp, input, 64);
//IP置换
Replace(temp,temp,IP_Table,64);
bool *L=&temp[0];
bool *R=&temp[32];
//16圈加密过程
for(i=0;i<16;i++){
memcpy(L_temp, R, 32);
Function(R,temp_f,order[i]);//f函数
Xor(L,temp_f);//异或运算
memcpy(R,L,32);
memcpy(L,L_temp,32);
}
//最后一圈
memcpy(output,R,32);
memcpy(output+32,L,32);
//IP逆置换
Replace(output,output,IPR_Table,64);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -