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; }