注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

过☆客

一颗迷茫的心在3D世界中飘荡...

 
 
 

日志

 
 
关于我

爱宁静,不爱喧闹, 爱奋斗,也爱自由, 爱顺其自然,爱独来独往, 没高学历,不算成功, 没车也没房,但我真诚, 走进你的世界,却不留痕迹, 我是过客,不只是过客...

网易考拉推荐
GACHA精选

tea算法  

2014-07-01 13:10:17|  分类: 日积月累-算法与 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
TEA(Tiny Encryption Algorithm)是一种分组加密算法,它的实现非常简单,通常只需要很精短的几行代码。TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。
TEA算法使用64位的明文分组和128位的密钥,它使用Feistel分组加密框架,需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。

void tea_encode(int* v, const int* k)
{
unsigned int y=v[0],z=v[1], sum=0, /* set up */
delta=0x9e3779b9, n=32 ; /* a key schedule constant */
while (n-->0) { /* basic cycle start */
sum += delta ;
y += (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ;
z += (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ; /* end cycle */
}
v[0]=y ; v[1]=z ;
}


void tea_decode(int* v, const int* k)
{
unsigned int n=32, sum, y=v[0], z=v[1],
delta=0x9e3779b9 ;
sum=delta<<5 ;

/* start cycle */
while (n-->0) {
z-= (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ;
y-= (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ;
sum-=delta ; }
/* end cycle */
v[0]=y ; v[1]=z ;
}

上面的代码实现了一个64位分组的加密算法。但对于一串数据,我们还需要进行分组的运算

// 实现数据少于少于8字节(64位)的数据加密

void tea_encode_byte(char* v, const int* k, int p)
{
char y[] = "Guo$Tea"; // 这是固定写的一个字符串,只要与解密相同即可,7字节长度
*v = *v^y[p]^(char)(k[p%4]%0xFF);
}

// in_buffer=加密的数据,in_size=数据长度,key=128位密钥,cipherRemains=是否加密8字节整数陪之外的数据

void tea_encode_buffer(char* in_buffer, unsigned int in_size, const int* key, int cipherRemains)
{
char *p;
unsigned int remain = in_size % 8; // 计算出数据8字节整数陪之外的数据
unsigned int align_size = in_size - remain; // 分组加密长度
for (p = in_buffer; p < in_buffer + align_size; p += 8)
tea_encode( (int*)p, key); // 8字节分组加密
 // 处理超出8字节整数陪的数据

if( remain > 0 && cipherRemains )
for (p = in_buffer + align_size; p < in_buffer + in_size; p += 1)
tea_encode_byte( p, key, --remain );
}


void tea_decode_byte(char* v, const int* k, int p)

{
char y[] = "Guo$Tea";
*v = *v^(char)(k[p%4]%0xFF)^y[p];
}

void tea_decode_buffer(char* in_buffer, unsigned int in_size, const int* key, int cipherRemains)
{
char *p;
unsigned int remain = in_size % 8;
unsigned int align_size = in_size - remain;
for (p = in_buffer; p < in_buffer + align_size; p += 8)
tea_decode( (int*)p, key);
if( remain > 0 && cipherRemains )
for (p = in_buffer + align_size; p < in_buffer + in_size; p += 1)
tea_decode_byte( p, key, --remain );
}







  评论这张
 
阅读(443)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017