本文共 3056 字,大约阅读时间需要 10 分钟。
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; } }}
转载地址:http://xgwti.baihongyu.com/