先感谢原作者(虽然你的程序无法直接运行有错误……)

//
/* DES(Data Encryption Standard) /
/
Written by Bunny /
/
Banyet Soft Labs. 1999 /
/
ALL RIGHTS RESERVED! /
/
注意! 版权所有! 可以自由转载,但不得加以修改或删除! /
/
E-mail:[email protected] Http://Assassin.yeah.net */
/
/

好了就让我开始吧。。。
**

问题描述: 对于DES加密算法,实现对较长明文数据的加密,要求明文长度>=32字节。

**

先复习下DES:

有关DES

算法步骤

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的**也是64位(实际用到了56位,第8、16、24、32、40、48、56、64位是校验位, 使得每个**都有奇数个1),其算法主要分为两步:
1)初始置换
其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50……D8;R0=D57D49……D7。
其置换规则见下表:
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7,
2)逆置换
经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
此算法是对称加密算法体系中的代表,在计算机网络系统中广泛使用。
DES分组加密算法C实现——解决加密长度任意的情况(有借鉴)

我们知道,DES可直接加密64bit的明码,那么对于明码长度任意时,一般采取低位补零的方法,然后每64bit加密一次完成。
贴上我修改后的代码吧:
(改了一点点吧)

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include "Schedle.h"

char str1[8], str2[99999];
int temp = 0;

class CShift{
public:
	DWORDLONG mask[16];
	int step[16];
	CShift(){
		for(int i=0;i<16;i++){
			step[i]=2;
			mask[i]=0xc000000;
		}
		step[0]=step[1]=step[8]=step[15]=1;
		mask[0]=mask[1]=mask[8]=mask[15]=0x8000000;
	}
};

class CDES{

public:

	CDES(){
		m_dwlKey=0;
		m_dwlData=0;
		ConvertTableToMask(dwlKey_PC_1,64);
		//PrintTable(dwlKey_PC_1,7,8);
		ConvertTableToMask(dwlKey_PC_2,56);
		ConvertTableToMask(dwlData_IP,64);
		ConvertTableToMask(dwlData_Expansion,32);
		ConvertTableToMask(dwlData_FP,64);
		ConvertTableToMask(dwlData_P,32);
		Generate_S();

	}
	void PrintBit(DWORDLONG);
	void EncryptKey(char *);
	unsigned char* EncryptData(unsigned char *);
	unsigned char* DescryptData(unsigned char*);

private:
	void ConvertTableToMask(DWORDLONG *,int);
	void Generate_S(void);
	void PrintTable(DWORDLONG*,int,int);
	DWORDLONG ProcessByte(unsigned char*,BOOL);
	DWORDLONG PermuteTable(DWORDLONG,DWORDLONG*,int);
	void Generate_K(void);
	void EncryptKernel(void);
	DWORDLONG Generate_B(DWORDLONG,DWORDLONG*);
	/*For verify schedule permutation only*/
	DWORDLONG UnPermuteTable(DWORDLONG,DWORDLONG*,int); 
	/**************************************/
	DWORDLONG dwlData_S[9][4][16];
	CShift m_shift;
	DWORDLONG m_dwlKey;
	DWORDLONG m_dwlData;
	DWORDLONG m_dwl_K[17];
};		

void CDES::EncryptKey(char *key){

	printf("\nOriginal Key: %s",key);
	m_dwlKey=ProcessByte((unsigned char*)key,TRUE);
//	PrintBit(m_dwlKey);
	m_dwlKey=PermuteTable(m_dwlKey,dwlKey_PC_1,56);
//	PrintBit(m_dwlKey);
	Generate_K();
//	printf("\n******************************************\n");
}

void CDES::Generate_K(void){

	DWORDLONG C[17],D[17],tmp;

	C[0]=m_dwlKey>>28;
	D[0]=m_dwlKey&0xfffffff;
	
	for(int i=1;i<=16;i++){
		tmp=(C[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]);
		C[i]=((C[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff;
		tmp=(D[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]);
		D[i]=((D[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff;
		m_dwl_K[i]=(C[i]<<28)|D[i];
		m_dwl_K[i]=PermuteTable(m_dwl_K[i],dwlKey_PC_2,48);
	}
}

DWORDLONG CDES::ProcessByte(unsigned char *key,BOOL shift){

	unsigned char tmp;
	DWORDLONG byte=0;
	int i=0;

	while(i<8){
		while(*key){
			if(byte!=0)
				byte<<=8;
			tmp=*key;
			if(shift)
				tmp<<=1;
			byte|=tmp;
			i++;
			key++;
		}
		if(i<8)
			byte<<=8;
		i++;
	}
	return byte;
}

DWORDLONG CDES::PermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen){

	int i=0;
	DWORDLONG tmp=0,moveBit;

	while(i<nDestLen){
		moveBit=1;
		if(dwlTable[i]&dwlPara){
			moveBit<<=nDestLen-i-1;
			tmp|=moveBit;
		}
		i++;
	}
	return tmp;
}

DWORDLONG CDES::UnPermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen){

	DWORDLONG tmp=0;
	int i=nDestLen-1;

	while(dwlPara!=0){
		if(dwlPara&0x01)
			tmp|=dwlTable[i];
		dwlPara>>=1;
		i--;
	}
	return tmp;
}

void CDES::PrintTable(DWORDLONG *dwlPara,int col,int row){

	int i,j;
	for(i=0;i<row;i++){
		printf("\n");
		getch();
		for(j=0;j<col;j++)
			PrintBit(dwlPara[i*col+j]);
	}
}

void CDES::PrintBit(DWORDLONG bitstream){

	char out[76];
	int i=0,j=0,space=0;

	while(bitstream!=0){
		if(bitstream&0x01)
			out[i++]='1';
		else
			out[i++]='0';
		j++;
		if(j%8==0){
			out[i++]=' ';
			space++;
		}
		
		bitstream=bitstream>>1;
	}
	out[i]='\0';
	strcpy(out,strrev(out));
	printf("%s **:%d\n",out,i-space);
}

void CDES::ConvertTableToMask(DWORDLONG *mask,int max){

	int i=0;
	DWORDLONG nBit=1;

	while(mask[i]!=0){
		nBit=1;
		nBit<<=max-mask[i];
		mask[i++]=nBit;
	}
}
		
void CDES::Generate_S(void){
	
	int i;
	int j,m,n;
	m=n=0;
	j=1;

	for(i=0;i<512;i++){
		dwlData_S[j][m][n]=OS[i];
		n=(n+1)%16;
		if(!n){
			m=(m+1)%4;
			if(!m)
				j++;
		}
	}
}

unsigned char * CDES::EncryptData(unsigned char *block){

	unsigned char *EncrytedData=new unsigned char(15);

	printf("\nOriginal Data: %s\n",block);
	m_dwlData=ProcessByte(block,0);
//	PrintBit(m_dwlData);
	m_dwlData=PermuteTable(m_dwlData,dwlData_IP,64);
	EncryptKernel();
//	PrintBit(m_dwlData);
	DWORDLONG bit6=m_dwlData;
	for(int i=0;i<11;i++){
		EncrytedData[7-i]=(unsigned char)(bit6&0x3f)+46;
		str1[7-i]=(unsigned char)(bit6&0x3f)+46;
		bit6>>=6;
	}

	EncrytedData[8]='\0';
	str1[8] = '\0';
	printf("\nAfter Encrypted: %s",EncrytedData);
	strncpy(str2 + 8 * temp, str1, 8);
	temp++;
	//puts(str1);

	for(int i=0;i<8;i++){
		EncrytedData[7-i]=(unsigned char)(m_dwlData&0xff);
		m_dwlData>>=8;
	}
	EncrytedData[8]='\0';


	return EncrytedData;
}

void CDES::EncryptKernel(void){

	int i=1;

	DWORDLONG L[17],R[17],B[9],EK,PSB;
	L[0]=m_dwlData>>32;
	R[0]=m_dwlData&0xffffffff;
	
	for(i=1;i<=16;i++){
		L[i]=R[i-1];
		R[i-1]=PermuteTable(R[i-1],dwlData_Expansion,48);	//Expansion R
		EK=R[i-1]^m_dwl_K[i];	//E Permutation
		PSB=Generate_B(EK,B);	//P Permutation
		R[i]=L[i-1]^PSB;
	}

	R[16]<<=32;
	m_dwlData=R[16]|L[16];
	m_dwlData=PermuteTable(m_dwlData,dwlData_FP,64);
}

unsigned char* CDES::DescryptData(unsigned char *desData){

	int i=1;
	unsigned char *DescryptedData=new unsigned char(15);
	DWORDLONG L[17],R[17],B[9],EK,PSB;
	DWORDLONG dataPara;

	dataPara=ProcessByte(desData,0);
	dataPara=PermuteTable(dataPara,dwlData_IP,64);

	R[16]=dataPara>>32;
	L[16]=dataPara&0xffffffff;
	
	for(i=16;i>=1;i--){
		R[i-1]=L[i];
		L[i]=PermuteTable(L[i],dwlData_Expansion,48);	//Expansion L
		EK=L[i]^m_dwl_K[i];	//E Permutation
		PSB=Generate_B(EK,B);	//P Permutation
		L[i-1]=R[i]^PSB;
	}

	L[0]<<=32;
	dataPara=L[0]|R[0];
	dataPara=PermuteTable(dataPara,dwlData_FP,64);

//	PrintBit(dataPara);

	for(i=0;i<8;i++){
		DescryptedData[7-i]=(unsigned char)(dataPara&0xff);
		dataPara>>=8;
	}
	DescryptedData[8]='\0';
	printf("\nAfter Decrypted: %s\n",DescryptedData);
    //strncpy(str1 + temp * 8, DescryptedData, 8);
    //temp++;
	return DescryptedData;
}

DWORDLONG CDES::Generate_B(DWORDLONG EKPara,DWORDLONG *block){

	int i,m,n;
	DWORDLONG tmp=0;

	for(i=8;i>0;i--){
		block[i]=EKPara&0x3f;
		m=(int)(block[i]&0x20)>>4;
		m|=block[i]&0x01;
		n=(int)(block[i]<<1)>>2;
		block[i]=dwlData_S[i][m][n];
		EKPara>>=6;
	}

	for(i=1;i<=8;i++){
		tmp|=block[i];
		tmp<<=4;
	}
	tmp>>=4;
	tmp=PermuteTable(tmp,dwlData_P,32);

	return tmp;
}

int main(){

	CDES des;
	char str[10], data[99999];
	printf("Please input the key:\n");
	gets(str);
	printf("Please input the Demodata:\n");
	gets(data); 
	int len = strlen(data);
	int num = 8 - (len % 8);
	for (int i = len; i < len + num; i++) {
		data[i] = '0';
	}
	for (int i = 0; i < strlen(data) / 8; i++) {
		char strtemp[8];
		strncpy(strtemp, data + i * 8, 8);
		strtemp[8] = '\0';
		//puts(strtemp);
		des.EncryptKey(str);
		unsigned char *result=des.EncryptData((unsigned char*)strtemp);
		des.DescryptData(result);
		//strncpy(str1 + i * 8, result, 8);
		//strncpy(str2 + i * 8, *result, 8);
	}
	printf("\n The Encode Data is : \n");
	puts(str2);

	data[len] = '\0';
	printf("\n The Decode Data is : \n");
	puts(data);

	return 0;
}


相关文章:

  • 2021-12-02
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2021-09-16
猜你喜欢
  • 2022-12-23
  • 2021-09-11
  • 2022-12-23
  • 2022-01-03
  • 2022-12-23
  • 2022-12-23
  • 2021-06-14
相关资源
相似解决方案