博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tars源码漫谈第18篇------tc_tea.h/tc_tea.cpp(TEA加解密)
阅读量:4141 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
laravel 修改api返回默认的异常处理
查看>>
laravel事务
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
25个构建Web项目的HTML建议,你需要了解一下!
查看>>
【web素材】02-10款大气的购物商城网站模板
查看>>
6种方式实现JavaScript数组扁平化(flat)方法的总结
查看>>
49个在工作中常用且容易遗忘的CSS样式清单整理
查看>>
20种在学习编程的同时也可以在线赚钱的方法
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>