TEA加密算法

来自WHY42

TEA(Tiny Encryption Algorithm)算法由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明。它是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。

#include <inttypes.h>

#define CYCLE_TIMES_ 32

static void encrypt(uint32_t *v, uint32_t *k) {
    uint32_t y = v[0], z = v[1], sum = 0, i;              /* set up */
    uint32_t delta = 0x9e3779b9;                          /* a key schedule constant */
    uint32_t a = k[0], b = k[1], c = k[2], d = k[3];      /* cache key */
    for (i = 0; i < CYCLE_TIMES_; i++) {                  /* basic cycle start */
        sum += delta;
        y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
        z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); /* end cycle */
    }
    v[0] = y;
    v[1] = z;
}

static void decrypt(uint32_t *v, uint32_t *k) {
    uint32_t y = v[0], z = v[1], sum = 0xC6EF3720, i;     /* set up */
    uint32_t delta = 0x9e3779b9;                          /* a key schedule constant */
    uint32_t a = k[0], b = k[1], c = k[2], d = k[3];      /* cache key */
    for (i = 0; i < CYCLE_TIMES_; i++) {                  /* basic cycle start */
        z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
        y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
        sum -= delta;                                     /* end cycle */
    }
    v[0] = y;
    v[1] = z;
}

需要注意的是,加密时要不足8位的要补齐。