tc_tea中实现的是TEA加解密算法, 业界用TEA还是相对较少的, 但查了一下资料, 发现这个TEA算法历史悠久, 且在工程上是安全的。
TEA的实现和使用都比AES要简单, 腾讯开源tars用到了这个算法, 看来腾讯有可能很喜欢这个算法, 并广泛使用。
看一下oi_symmetry_encrypt2, oi是什么意思? 是oicq的意思, 腾讯qq的来源。
源码其实不用细看, 无非就是变换而已, 加密,解密。 正所谓过程可能复杂, 但逻辑很简单。
还是看一下部分源码, 头大, 赶紧闪人:
/*pKey为16byte*/
/*
输入:pInBuf为需加密的明文部分(Body),nInBufLen为pInBuf长度;
输出:pOutBuf为密文格式,pOutBufLen为pOutBuf的长度是8byte的倍数;
*/
/*TEA加密算法,CBC模式*/
/*密文格式:PadLen(1byte)+Padding(var,0-7byte)+Salt(2byte)+Body(var byte)+Zero(7byte)*/
void TC_Tea::oi_symmetry_encrypt2(const char* pInBuf, size_t nInBufLen, const char* pKey, char* pOutBuf, size_t *pOutBufLen)
{
size_t nPadSaltBodyZeroLen/*PadLen(1byte)+Salt+Body+Zero的长度*/;
size_t nPadlen;
char src_buf[8], iv_plain[8], *iv_crypt;
size_t src_i, i, j;
/*根据Body长度计算PadLen,最小必需长度必需为8byte的整数倍*/
nPadSaltBodyZeroLen = nInBufLen/*Body长度*/+1+SALT_LEN+ZERO_LEN/*PadLen(1byte)+Salt(2byte)+Zero(7byte)*/;
if((nPadlen=nPadSaltBodyZeroLen%8)) /*len=nSaltBodyZeroLen%8*/
{
/*模8余0需补0,余1补7,余2补6,...,余7补1*/
nPadlen=8-nPadlen;
}
/*srand( (unsigned)time( NULL ) ); 初始化随机数*/
/*加密第一块数据(8byte),取前面10byte*/
// src_buf[0] = ((char)rand()) & 0x0f8/*最低三位存PadLen,清零*/ | (char)nPadlen;
src_buf[0] = (((char)rand()) & 0x0f8) | (char)nPadlen;
src_i = 1; /*src_i指向src_buf下一个位置*/
while(nPadlen--)
src_buf[src_i++]=(char)rand(); /*Padding*/
/*come here, src_i must <= 8*/
for ( i=0; i<8; i++)
iv_plain[i] = 0;
iv_crypt = iv_plain; /*make zero iv*/
*pOutBufLen = 0; /*init OutBufLen*/
for (i=1;i<=SALT_LEN;) /*Salt(2byte)*/
{
if (src_i<8)
{
src_buf[src_i++]=(char)rand();
i++; /*i inc in here*/
}
if (src_i==8)
{
/*src_i==8*/
for (j=0;j<8;j++) /*加密前异或前8个byte的密文(iv_crypt指向的)*/
src_buf[j]^=iv_crypt[j];
/*pOutBuffer、pInBuffer均为8byte, pKey为16byte*/
/*加密*/
TeaEncryptECB(src_buf, pKey, pOutBuf);
for (j=0;j<8;j++) /*加密后异或前8个byte的明文(iv_plain指向的)*/
pOutBuf[j]^=iv_plain[j];
/*保存当前的iv_plain*/
for (j=0;j<8;j++)
iv_plain[j]=src_buf[j];
/*更新iv_crypt*/
src_i=0;
iv_crypt=pOutBuf;
*pOutBufLen+=8;
pOutBuf+=8;
}
}
/*src_i指向src_buf下一个位置*/
while(nInBufLen)
{
if (src_i<8)
{
src_buf[src_i++]=*(pInBuf++);
nInBufLen--;
}
if (src_i==8)
{
/*src_i==8*/
for (j=0;j<8;j++) /*加密前异或前8个byte的密文(iv_crypt指向的)*/
src_buf[j]^=iv_crypt[j];
/*pOutBuffer、pInBuffer均为8byte, pKey为16byte*/
TeaEncryptECB(src_buf, pKey, pOutBuf);
for (j=0;j<8;j++) /*加密后异或前8个byte的明文(iv_plain指向的)*/
pOutBuf[j]^=iv_plain[j];
/*保存当前的iv_plain*/
for (j=0;j<8;j++)
iv_plain[j]=src_buf[j];
src_i=0;
iv_crypt=pOutBuf;
*pOutBufLen+=8;
pOutBuf+=8;
}
}
/*src_i指向src_buf下一个位置*/
for (i=1;i<=ZERO_LEN;)
{
if (src_i<8)
{
src_buf[src_i++]=0;
i++; /*i inc in here*/
}
if (src_i==8)
{
/*src_i==8*/
for (j=0;j<8;j++) /*加密前异或前8个byte的密文(iv_crypt指向的)*/
src_buf[j]^=iv_crypt[j];
/*pOutBuffer、pInBuffer均为8byte, pKey为16byte*/
TeaEncryptECB(src_buf, pKey, pOutBuf);
for (j=0;j<8;j++) /*加密后异或前8个byte的明文(iv_plain指向的)*/
pOutBuf[j]^=iv_plain[j];
/*保存当前的iv_plain*/
for (j=0;j<8;j++)
iv_plain[j]=src_buf[j];
src_i=0;
iv_crypt=pOutBuf;
*pOutBufLen+=8;
pOutBuf+=8;
}
}
}