最近在做的项目的传输系统上使用了TEA加密,采集端使用Java,但是说实在的换了多少个版本的Java实现都不能正确解密。。。
先简单介绍下TEA,据说QQ也在用。
TEA(Tiny Encryption Algorithm) 是一种简单高效的加密算法,以加密解密速度快,实现简单著称。算法真的很简单,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮。目前我只知道QQ一直用的是16轮TEA。没什么好说的,先给出C语言的源代码(默认是32轮)。
C语言实现:
tea_encrypt.h
#include <stdint.h>
/*void encrypt(uint32_t v[], uint32_t k[]);
void decrypt(uint32_t v[], uint32_t k[]);*/
extern void encrypt(uint32_t v[]);
extern void decrypt(uint32_t v[]);
tea_encrypt.c
#include "tea_encrypt.h"
static uint32_t tea_keys[4] = {
0x2B6D5E6D, 0x24AAB7C3, 0x0E3E55F0, 0x21241BA9};
/*void encrypt(uint32_t v[], uint32_t k[])*/
void encrypt(uint32_t v[])
{
uint32_t v0 = v[0], v1 = v[1], sum = 0, i = 0; /* set up */
uint32_t delta = 0x9E378198; /* a key schedule constent */
uint32_t k0 = tea_keys[0], k1 = tea_keys[1], k2 = tea_keys[2], k3 = tea_keys[3]; /* cache key*/
for(i=0; i<32; i++)
{
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;