加密算法之(二)--- TEA加密算法

tea加密算法采用CBC加密模式:
加密算法之(二)--- TEA加密算法_第1张图片
优点:
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;  
}  

你可能感兴趣的:(Web,Safe,Math)