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

📄 des_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 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 + -