C++ Tea

Tea算法属于分组加密、对称加密的一种,对于对称加密算法,解密过程就是一种对加密过程的逆运算,根本不需要什么数学证明。简单来说就是我有两个数 a,b ,a+=k1b,b+=k2a,a+=k3b,b+=k4a.....a+=knb,b+=kna,最后存储的就是最后的a,b的值,那么我可以用a去还原b,还原后的b又可以去还原上一个a,以此类推,对称加密和把两根绳子螺旋捆在一起,然后反向旋转分开的过程。在对称加密的设计中,最怕的就是虽然我看到的是这个地方的密文,但其实我是知道这个地方的原文,那么我很有可能把key给推算出来,从而把整个密文都给破掉,具体的那些攻击方法以后再说吧。tea算法以8个字节为一组进行分组加密,加密时,又分为两部分,每部分4个字节。key是128位,32位机上就是4个字节。对于数据的话还要考虑填充,tea算法中轮数,决定着tea算法的安全性,所以说32轮的话,还是很能抗差分攻击的。




#pragma once
class tea
{
	const int delta = 0x9E3779B9;//黄金数
	int c;//轮数
	int len;//加密后的长度
	uchar* buf;
	int* key;
	void Encrypt();
	void Decrypt();
public:
	uchar* enData;
	uchar* deData;
	tea(uchar* str,uchar* key,int size,int c=16);
	~tea();
};


#include "stdafx.h"
#include "tea.h"
#include <ctime>

//加密后结构 buf[0] +a(rand) + 2(rand) + data +7(0),参考TX
tea::tea(uchar* str, uchar* key, int size,int c)
{
	srand(time(0));
	this->c = c;
	int a = (size + 10) % 8;//a表示随机填充字节数,buf[0]高3位写入a,buf[0]其余位随机填充
	len = size + a + 10;//加密后总长度
	buf = new uchar[len];
	int f=a<<5|rand() % 32;//将f放在高3位处,其余位随机填充
	buf[0] = f;
	for(int i=1;i<=a+2;++i)
	{
		buf[i] = rand() % 256;//填充a+2个随机数
	}
	memcpy(buf + a + 3, str, size);
	memset(buf + (len - 7), 0, 7);//末尾填充7个0,使得长度为 a+3+7 +size

	this->key = new int[4];
	for(int i=0;i<4;++i)//将key分为4部分
	{
		memcpy(&this->key[i], key + 4 * i, 4);
	}
	Encrypt();
	Decrypt();
}


void tea::Encrypt()
{
	enData = new uchar[len];
	int times = len / 8;
	for(int i=0;i<times;++i)
	{
		int c1 = c;
		int b = 8 * i;
		int sum = 0;
		int left=0,right=0;
		memcpy(&left, buf + b, 4);
		memcpy(&right, buf + b + 4, 4);
		while(c1-->0)
		{
			sum += delta;
			left += ((right << 4) + key[0]) ^ (right + sum) ^ ((right >> 5) + key[1]);
			right += ((left << 4) + key[2]) ^ (left + sum) ^ ((left >> 5) + key[3]);
		}
		memcpy(enData + b, &left, 4);
		memcpy(enData + b+4, &right, 4);
	}
	delete buf;
}

void tea::Decrypt()
{
	uchar* temp=deData = new uchar[len];
	int times = len / 8;
	for (int i = 0; i<times; ++i)
	{
		int c1 = c;
		int b = 8 * i;
		int sum = delta<<(int)(log(c)/log(2));//计算加密后的sum值
		int left, right;
		memcpy(&left, enData + b, 4);
		memcpy(&right, enData + b + 4, 4);
		while (c1-->0)
		{
			right -= ((left << 4) + key[2]) ^ (left + sum) ^ ((left >> 5) + key[3]);
			left -= ((right << 4) + key[0]) ^ (right + sum) ^ ((right >> 5) + key[1]);
			sum -= delta;
		}
		memcpy(temp + b, &left, 4);
		memcpy(temp + b + 4, &right, 4);
	}

	int a=temp[0] >> 5;
	int oriLen = len - a - 10;
	deData = new uchar[oriLen];
	memcpy(deData, temp + a + 3, oriLen);
	delete temp;
}

tea::~tea()
{
	delete enData;
	delete deData;
}



猜你喜欢

转载自blog.csdn.net/nightwizard2030/article/details/78510806
今日推荐