我是靠谱客的博主 闪闪蛋挞,最近开发中收集的这篇文章主要介绍TEA加密算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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加密算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部