⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00des_main.h

📁 des加密 支持短块加密 文件加密 弱密钥过滤 还附加随机性测试
💻 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 + -