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

📄 tea.cpp

📁 TEA加密解密算法的完整实现。并且能够实现对数据库中的数据进行加解密操作。
💻 CPP
字号:
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <iostream.h>

#define NM 8
#define LENGTH_OF_TEXT 20

struct LONGWORD
{
	long x;
	long y;
};

void tea()
{
	long y = 1209398;
	long z = 3209090;
	long sum = 0;
	long Delta=0x9E3779B9;
	
	long a = 7829489;
	long b = 2398298;
	long c = 3289993;
	long d = 4893849;

	char pstr[]="杨翠罗";
	cout<<pstr<<endl;
	printf("%x\n",pstr);

	DWORD dd=0x12fed0;
	printf("%s\n",dd);

	int n = 32;

	DWORD ads=0x9E3779B9;

	UINT32 data = 0x9E3779B9;	
	cout<<data<<endl;

	BYTE byte = 70;//32326
	cout<<"byte = "<<byte<<endl;
	cout<<(byte&(0xff00)>>8)<<endl;
	

	cout<<y<<" "<<z<<" "<<sum<<" "<<Delta<<" "<<ads<<endl;
	printf("%x\n",ads);
	cout<<a<<"	"<<b<<"	"<<c<<"	"<<d<<endl;
}



void DwordToByte(DWORD data,BYTE bytes[4])
{
	int i = 0;
	for(i = 0;i < 4;i ++)
		bytes[i] = 0;

	bytes[0] = (BYTE)(data>>0);
	bytes[1] = (BYTE)(data>>8);
	bytes[2] = (BYTE)(data>>16);
	bytes[3] = (BYTE)(data>>24);

	printf("%x 转换成Byte为: ",data);
	for(i = 0;i < 4;i ++)
	{
		BYTE bits[2];
		bits[0] = bytes[4-i-1]&0x0F;
		bits[1] = (bytes[4-i-1]&0xF0)>>4;
		for(int j = 1;j > -1; j--)
		{
			switch(bits[j])
			{
			case 0x00:
				printf("0000");
				break;
			case 0x01:
				printf("0001");
				break;
			case 0x02:
				printf("0010");
				break;
			case 0x03:
				printf("0011");
				break;
			case 0x04:
				printf("0100");
				break;
			case 0x05:
				printf("0101");
				break;
			case 0x06:
				printf("0110");
				break;
			case 0x07:
				printf("0111");
				break;
			case 0x08:
				printf("1000");
				break;
			case 0x09:
				printf("1001");
				break;
			case 0x0A:
				printf("1010");
				break;
			case 0x0B:
				printf("1011");
				break;
			case 0x0C:
				printf("1100");
				break;
			case 0x0D:
				printf("1101");
				break;
			case 0x0E:
				printf("1110");
				break;
			case 0x0F:
				printf("1111");
				break;
			default:
				break;
			}
		}
		printf(",");
	//	printf("%x\t",bytes[4-i-1]);
	}
	printf("\n");
}

DWORD BytesToDword(BYTE bytes[4])
{
	DWORD result = 0;
	for(int i = 0;i < 4;i ++)
	{
		result=(DWORD)(result << 8);
		result +=(DWORD)(bytes[4-i-1] & 0x000000ff);
	}
	printf("将");
	for(i = 0;i < 4;i ++)
		printf("%x\t",bytes[4-i-1]);
	printf("转换成DWORD为: %x\n",result);
	return result;
}

void DwordToChar(DWORD word,char dd[5])
{
	dd[0] = (char)((word >> 24)&0xFF);
	dd[1] = (char)((word >> 16)&0xFF);
	dd[2] = (char)((word >> 8)&0xFF);
	dd[3] = (char)((word & 0xFF));
	dd[4] = '\0';
}

DWORD CharToDword(char dd[5])
{
	DWORD word = 0;

	for(int i = 0;i < 4;i ++)
	{
		DWORD temp = 0x0;
		temp = temp ^ ((dd[i]+256)%256);
		temp = temp<<(3-i)*8;
		word +=temp;
	}
	return word;
}


DWORD leftRotate(DWORD data,int n)
{
	if(n<= 0)
		return data;
	else
	{
		DWORD result =data;
	//	BYTE bytes[4]={0};
	//	DwordToByte(data,bytes);
		printf("%x\n",result);
		for(int i = 0;i < n;i ++)
		{
			result = result << (0x1);
			printf("%x\n",result);
		}
		return result;
	}

}


void Encrypt(DWORD v[2],DWORD k[4])
{
	int len = 0;
	printf("Before Encryption :\n");
	for(int i = 0;i < 2;i ++)
		printf("%x ",v[i]);
	printf("\n");
	DWORD y = v[0],z=v[1];
	DWORD Delta = 0x9E3779B9,sum = 0;
	DWORD a = k[0],b=k[1],c=k[2],d=k[3];
	int n = NM;
//	leftRotate(z,4);
	FILE *fp = fopen("encrypt.txt","w");
	if(fp == NULL)
		exit(0);
	fprintf(fp,"%x		%x\n",y,z);
	printf("y = %x,z = %x\n",y,z);

	while(n-- > 0)
	{
		cout<<endl<<"-------------------第"<<NM-n<<"加密次迭代----------------------"<<endl;
		BYTE bytes[4]={0};
		sum = sum+Delta;
		printf("y = %x : ",y);
		DwordToByte(y,bytes);
		printf("\n");
	

		printf("z << 4 = %x : ",z<<4);
		DwordToByte(z<<4,bytes);
		printf("\n");

		printf("a ^ z = %x : ",a^z);
		DwordToByte(a^z,bytes);
		printf("\n");

		printf("sum^(z>>5) = %x : ",sum^(z>>5));
		DwordToByte(sum^(z>>5),bytes);
		printf("\n");

		printf("b = %x\t\t:\t",b);
		DwordToByte(b,bytes);
		printf("\n");

		y += (z << 4) + (a^z) + (sum^(z >> 5)) + b;

		printf("y = %x : ",y);
		DwordToByte(y,bytes);
		printf("\n");

		
		printf("z = %x\t: ",z);
		DwordToByte(z,bytes);
		printf("\n");

		printf("y << 4 = %x : ",y<<4);
		DwordToByte(y<<4,bytes);
		printf("\n");

		printf("y >> 5 = %x : ",y>>5);
		DwordToByte(y>>5,bytes);
		printf("\n");		
		
		printf("c ^ y = %x : ",c^y);
		DwordToByte(c^y,bytes);
		printf("\n");
		
		printf("sum^(y>>5) = %x : ",sum^(y>>5));
		DwordToByte(sum^(y>>5),bytes);
		printf("\n");

		printf("d = %x\t\t:\t",d);
		DwordToByte(d,bytes);
		printf("\n");

		printf("z = %x : ",z);
		DwordToByte(z,bytes);
		printf("\n");


		z += (y << 4) + (c^y) + (sum^(y >> 5)) + d;
		printf("y = %x,z = %x\n",y,z);
		fprintf(fp,"%x		%x\n",y,z);
		char temp[5]={'\0'};
		DwordToChar(y,temp);
		cout<<temp;
		DwordToChar(z,temp);
		cout<<temp<<endl;
	}
	
	v[0] = y;
	v[1] = z;

	printf("After Encryption :\n");
	for(i = 0;i < 2;i ++)
		printf("%x",v[i]);
	printf("\n");
	fclose(fp);
}

void Decrypt(DWORD v[2],DWORD k[4])
{

	DWORD y = v[0],z=v[1];
	DWORD a = k[0],b=k[1],c=k[2],d=k[3];
	DWORD sum = 0x0;
	DWORD Delta = 0x9E3779B9;

	FILE *fp = fopen("Decrypt.txt","w");
	if(fp == NULL)
		exit(0);
	fprintf(fp,"%x		%x\n",y,z);

	printf("Before Decryption :\n");
	for(int i = 0;i < 2;i ++)
		printf("%x ",v[i]);
	printf("\n");
	int n = NM;

	for(i = 0;i < n;i ++)
		sum +=Delta;

	printf("y = %x,z = %x\n",y,z);
	while(n-- > 0)
	{
		//printf("z<<4 = %x,z>>5 = %x,y<<4 = %x,y>>5 = %x\n",z<<4,z>>5,y<<4,y>>5);
		
		cout<<endl<<"-------------------第"<<NM-n<<"解密次迭代----------------------"<<endl;
		BYTE bytes[4]={0};
		printf("y = %x : ",y);
		DwordToByte(y,bytes);
		printf("\n");
		printf("y << 4 = %x : ",y<<4);
		DwordToByte(y<<4,bytes);
		printf("\n");
		printf("y >> 5 = %x : ",y>>5);
		DwordToByte(y>>5,bytes);
		printf("\n");

		printf("z = %x\t: ",z);
		DwordToByte(z,bytes);
		printf("\n");

		printf("a = %x\t\t:\t",a);
		DwordToByte(a,bytes);
		printf("\n");

		printf("a ^ z = %x : ",a^z);
		DwordToByte(a^z,bytes);
		printf("\n");

		printf("z << 4 = %x : ",z<<4);
		DwordToByte(z<<4,bytes);
		printf("\n");

		printf("z >> 5 = %x : ",z>>5);
		DwordToByte(z>>5,bytes);
		printf("\n");
		
		printf("sum = %x : ",sum);
		DwordToByte(sum,bytes);
		printf("\n");
		
		printf("sum^(y>>5) = %x : ",sum^(y>>5));
		DwordToByte(sum^(y>>5),bytes);
		printf("\n");


		z -=((y<<4) + (c^y) + (sum^(y>>5)) + d);
		y -=((z<<4) + (a^z) + (sum^(z>>5)) + b);
		sum = sum-Delta;
		printf("y = %x,z = %x\n",y,z);
		fprintf(fp,"%x		%x\n",y,z);
		char temp[5]={'\0'};
		DwordToChar(y,temp);
		cout<<temp;
		DwordToChar(z,temp);
		cout<<temp<<endl;
	}
	v[0] = y;
	v[1] = z;

	fclose(fp);
	printf("After Decryption :\n");
	for(i = 0;i < 2;i ++)
		printf("%x",v[i]);
	printf("\n");
}

void copyChar(char *dest,const char *src,int start,int end)
{
	if(dest == NULL)
		return;
	if(src == NULL)
		return;

	int i = 0;
	for(i = start;i < end;i ++)
	{
		if(*(src+i) == '\0')
			break;
		*(dest+i-start) = *(src+i); 
	}
}

void converge(char *dest,const char *src,int size)
{
	int i = 0;
	int len = strlen(dest);
	for(i = 0;i < size;i ++)
	{
		dest[len+i]=src[i];
	}
}

void main()
{
	char plaintext[LENGTH_OF_TEXT] ="郭会林和杨翠罗";
	int i = 0;
	int j = 0;
	char temp[5] ={'\0'};

	printf("plaintext = 0x%x\n",plaintext);
	cout<<plaintext<<endl;

	int len = 0;

	DWORD v[2] ={0x12fed8,0x12fed8};
	DWORD k[4]={0x61,0x62,0x63,0x64};

	len = strlen(plaintext);
	//cout<<strlen(plaintext)<<"	"<<lstrlen(plaintext)<<endl;
	//copyChar(temp,plaintext,8,12);
	cout<<temp<<endl;
	char result[100]={'\0'};


/*
	for(i = 0;i < len;i += 8)
	{
		memset(temp,'\0',sizeof(char));
		copyChar(temp,plaintext,i,i+4);
		v[0] = CharToDword(temp);
		memset(temp,'\0',sizeof(char));
		copyChar(temp,plaintext,i+4,i+8);
		v[1] = CharToDword(temp);

		memset(temp,'\0',sizeof(char));
		DwordToChar(v[0],temp);
		converge(result,temp,5);
		cout<<temp<<endl;
		memset(temp,'\0',sizeof(char));
		DwordToChar(v[1],temp);
		converge(result,temp,5);
		cout<<temp<<endl;
	}
*/
	cout<<"result "<<result<<endl;
	cout<<k<<endl;
	cout<<"加密前的字符串:"<<endl;
	copyChar(temp,plaintext,0,4);
	cout<<temp;
	v[0] = CharToDword(temp);
	copyChar(temp,plaintext,4,8);
	cout<<temp<<endl;
	v[1] = CharToDword(temp);
	Encrypt(v,k);
	cout<<"加密后的字符串:"<<endl;
	DwordToChar(v[0],temp);
	cout<<temp;
	DwordToChar(v[1],temp);
	cout<<temp<<endl;
	Decrypt(v,k);
	cout<<"解密后的字符串:"<<endl;
	DwordToChar(v[0],temp);
	cout<<temp;
	DwordToChar(v[1],temp);
	cout<<temp<<endl;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -