TEA加密算法与密钥管理

TEA算法

TEA算法在腾讯QQ中大量使用。算法简单,容易实现,但是加密强度并不小,适合在嵌入式系统中使用。
TEA算法(Tiny Encryption Algorithm,小型加密算法)由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明。它是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。
TEA的结构类似于Feistel 密码结构,Feistel结构中一轮操作的左半部分与F函数输出是进行异或的运算(加解密流程相同);而TEA加密是进行+操作,解密时进行-操作(加解密流程不同)。说TEA是小型加密算法,其实是说其F函数比较简单,不像DES的F函数那么复杂,TEA的F函数只是进行简单的移位、加法、异或等操作,但是这不意味着TEA加密算法不安全。
TEA的一轮结构如下图:
在这里插入图片描述

#include <stdio.h>
#include <stdint.h>
 
//加密函数
void encrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0, i;           /* set up */
    uint32_t delta=0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i < 32; i++) {                       /* basic cycle start */
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}
//解密函数
void decrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i;  /* set up */
    uint32_t delta=0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i<32; i++) {                         /* basic cycle start */
        v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
        v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        sum -= delta;
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}
 
int main()
{
    uint32_t v[2]={1,2},k[4]={2,2,3,4};
    // v为要加密的数据是两个32位无符号整数
    // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
    printf("加密前原始数据:%u %u\n",v[0],v[1]);
    encrypt(v, k);
    printf("加密后的数据:%u %u\n",v[0],v[1]);
    decrypt(v, k);
    printf("解密后的数据:%u %u\n",v[0],v[1]);
    return 0;
}

该算法中,被加密的数据是两个数字,密钥是4个无符号的32位整数(共128bit)。事实上,被加密的数据也可以是字符串,一个完整的例子如下:
TEA加密算法详解
https://jingyan.baidu.com/article/b2c186c829035dc46ef6ffd7.html

密钥的生成

密钥不能采用固定的密钥值,每个设备的密钥都不一样(每个设备的密钥本身也要是随机值,或者采用某种算法包装的不易被发现规律的值)。这样,即使加密算法被破解也无法破解数据,即使某个设备的密钥被拿到,其它设备的密钥也无法知道,依然无法破解其他设备的数据。
方法一:key = fun(设备ID+设备入网时间)
安全性分析:即使破解了TEA算法,还要再次破解密钥的算法。
方法二:key = fun(设备ID+设备入网时间+随机数)
备注:在设备出厂时自带一个唯一的随机数(不能用设备ID,因为ID有规律可循),入网时将该随机数告诉服务器,服务器将设备的随机数存储下来。(由于入网时间已经带有一定的随机性,可部分替代随机数,无需另外的随机数了)
安全性分析:TEA算法+密钥算法+随机数

fun函数可以使用MD5算法,可以在单片机上实现。
MD5算法特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

猜你喜欢

转载自blog.csdn.net/xys430381_1/article/details/86243989