持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
Tea加密简介
TEA算法剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明。它是一种分组密码算法),其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。
它的实现非常简单,通常只需要很精短的几行代码。
注意事项
可能会踩到的坑 和一些重点
文本直接复制会有数据丢失,可以使用工具:010Editor 复制16进制
char* 向 int* 转换会影响步长
因为密码,明文可能不足长度,所以要初始化,好自动补齐
Tea加密算法源码
#include<stdio.h>
#define DELTA 0x9e3779b9
void tea_encrypt(unsigned int* v, unsigned int* key) {
unsigned int l = v[0], r = v[1], sum = 0;
for (size_t i = 0; i < 32; i++) { //进行32次迭代加密,Tea算法作者的建议迭代次数
l += (((r << 4) ^ (r >> 5)) + r) ^ (sum + key[sum & 3]);
sum += DELTA; //累加Delta的值
r += (((l << 4) ^ (l >> 5)) + l) ^ (sum + key[(sum >> 11) & 3]); //利用多次双位移和异或将明文与密钥扩散混乱,并将两个明文互相加密
}
v[0] = l;
v[1] = r;
}
void tea_decrypt(unsigned int* v, unsigned int* key) {
unsigned int l = v[0], r = v[1], sum = 0;
sum = DELTA * 32; //32次迭代累加后delta的值
for (size_t i = 0; i < 32; i++) {
r -= (((l << 4) ^ (l >> 5)) + l) ^ (sum + key[(sum >> 11) & 3]);
sum -= DELTA;
l -= (((r << 4) ^ (r >> 5)) + r) ^ (sum + key[sum & 3]);
}
v[0] = l;
v[1] = r;
}
int main(int argc, char const *argv[])
{
unsigned int key[4]={0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f};
unsigned int v1[2] = {0xaabbccdd,0x01234567};
tea_encrypt(v1,key);
printf("tea_encrypt:%x %x\n",v1[0],v1[1]);
tea_decrypt(v1,key);
printf("tea_decrypt:%x %x\n",v1[0],v1[1]);
return 0;
tea算法最关键的是要找到DELTA值和128位的key。 找到这两个部分是我们解题的关键