本文最后更新于96 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言
上一次学习了TEA加密算法,但是在做题的过程中,目前我还没遇到过TEA加密算法,倒是会遇到XTEA,所以这不得不去学了,最近发现加密算法实在是有点小多,而我还没学完。
XTEA加密算法自然是TEA加密算法的升级版本了,它的全称是 Extended Tiny Encryption Algorithm,既然是升级版本,它就会跟TEA算法很相似。
这个在B站也有相关视频:
XTEA加密
我们先来直接看它的C语言代码实现:
#include <stdint.h>
#include <string.h>
void xtea_encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
uint32_t sum = 0;
uint32_t delta = 0x9E3779B9;
uint32_t k[4];
memcpy(k, key, sizeof(k));
uint32_t v0 = v[0];
uint32_t v1 = v[1];
for (unsigned int i = 0; i < num_rounds; i++) {
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
sum += delta;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
}
v[0] = v0;
v[1] = v1;
}
和TEA加密一样,有两个常量很重要,一个就是这个delta,值为0x9e3779b9,和TEA加密中一样,它是怎么得来的,在TEA加密算法原理学习那篇文章里面有说到,关于XTEA的一些数据,那篇文章可能也都有提及到。
还有一个是num_rounds,也就是加密的轮数,TEA加密算法的推荐加密轮数是32轮,这里XTEA的加密轮数,我看到有些文章是说推荐64轮,有的是说32轮,但是说是32轮的还是居多,一看那些文章都是高度重合的,网络上的计算机文章就是你抄我,我抄你,真是没意思,不过我这样查询网上文章来写博客倒也算抄,除非把XTEA加密算法的论文找出来学。
XTEA加密算法的密钥长度一般为128位,即16字节,这种密钥长度在实际应用中似乎都是可以修改的,明文数据,即待加密的数据一般是64位,即8字节。
首先看初始化
void xtea_encipher(unsigned int num_rounds, uint32_t v[2], const uint32_t key[4]) {
uint32_t sum = 0;
uint32_t delta = 0x9E3779B9;
uint32_t k[4];
memcpy(k, key, sizeof(k));
uint32_t v0 = v[0];
uint32_t v1 = v[1];
明文分成两组,每组32位,密钥分成4组,每组也是32位,且都是无符号整数。
然后是加密过程
for (unsigned int i = 0; i < num_rounds; i++) {
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
sum += delta;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
}
v[0] = v0;
v[1] = v1;
这里的加密过程就和TEA加密算法不一样了,全都是可逆的运算,我们可以记XTEA加密算法中有密钥数组的索引,如k[sum&3]和k[(sum>>11)&3]),而TEA加密当中没有这样的操作。
XTEA解密
直接放解密的C语言代码实现
void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
unsigned int i;
uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
for (i=0; i < num_rounds; i++) {
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
sum -= delta;
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
}
v[0]=v0; v[1]=v1;
}
关于解密的逻辑,我在TEA加密算法那篇文章里面说过了,在这里就不再多说了。