概述
tea加密算法采用CBC加密模式:
优点:
1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
缺点:
1.不利于并行计算;
2.误差传递;
3.需要初始化向量IV
更多加密模式请参考:http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html
Tea算法秘钥为16字节,每次分块处理的数据是8个字节,两个32位数据。
加密过程中,加法运算和减法运算用作可逆的操作,算法轮流使用异或运算提供非线性特性,双移位操作使秘钥和数据的所有比特重复地混合,最多 16 轮循环就能使数据或密钥的单个比特的变化扩展到接近 32 比特. 因此 ,当循环轮数达到 16 轮以上时 ,该算法具有很强的抗差分攻击能力 ,128 比特密钥长度可以抗击穷举搜索攻击 ,该算法
设计者推荐算法迭代次数为 32 轮。
加密器的实现:
//两个32位数据,32次循环加密
static void tea_encrypt(uint32_t *v,uint32_t *k)
{
uint32_t y = v[0],z = v[1],sum = 0,i;
uint32_t delta = 0xcccccccc;
uint32_t a = k[0],b = k[1],c = k[2],d = k[3];
for (i = 0;i < 32;i++)
{
sum += delta;
y += ((z << 2) + a) ^ (z + sum) ^ ((z >> 7) + b);
z += ((y << 2) + c) ^ (y + sum) ^ ((y >> 7) + d);
}
v[0] = y;
v[1] = z;
}
uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key)
{
uint8_t a = 0;
uint16_t i = 0;
uint16_t num = 0;
//将明文补足为8字节的倍数
a = size_src % 8;
if (a != 0)
{
for (i = 0;i < 8 - a;i++)
{
src[size_src++] = 0;
}
}
//加密
num = size_src / 8;
for (i = 0;i < num;i++)
{
tea_encrypt((uint32_t *)(src + i * 8),(uint32_t *)key);
}
return size_src;
解密器的实现:
static void tea_decrypt(uint32_t *v,uint32_t *k)
{
uint32_t y = v[0],z = v[1],sum = 0xC6EF3720,i;
uint32_t delta = 0xcccccccc;
uint32_t a = k[0],b = k[1],c = k[2],d = k[3];
for (i = 0;i < 32;i++)
{
z -= ((y << 2) + c) ^ (y + sum) ^ ((y >> 7) + d);
y -= ((z << 2) + a) ^ (z + sum) ^ ((z >> 7) + b);
sum -= delta;
}
v[0] = y;
v[1] = z;
}
uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key)
{
uint16_t i = 0;
uint16_t num = 0;
//判断长度是否为8的倍数
if (size_src % 8 != 0)
{
return 0;
}
//解密
num = size_src / 8;
for (i = 0;i < num;i++)
{
tea_decrypt((uint32_t *)(src + i * 8),(uint32_t *)key);
}
return size_src;
}
最后
以上就是闪闪蛋挞为你收集整理的TEA加密算法的全部内容,希望文章能够帮你解决TEA加密算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复