C++ Tea

来源:互联网 发布:渠道 知乎 编辑:程序博客网 时间:2024/06/05 09:14

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 onceclass 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),参考TXtea::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 +sizethis->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;}



原创粉丝点击