烦了,题目遇到XXTEA加密算法又不会,这玩意也考的挺多的,XXTEA考得多,XTEA也考得挺多,就是不考TEA。😅
C语言实现TEA系列加解密算法_tea加解密 c语言-CSDN博客
XXTEA加密算法得全称自然就是Extended Extended Tiny Encryption Algorithm,不必多说,也有些和初始得TEA加密算法相似的地方,但相比XTEA的改动,XXTEA的改动看起来要多一些。在网上介绍这个加密算法的文章也少了一些
C语言代码实现
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
void btea(uint32_t *v, int n, uint32_t const key[4])
{
uint32_t y, z, sum;
unsigned p, rounds, e;
if (n > 1) /* Coding Part */
{
rounds = 6 + 52/n;
sum = 0;
z = v[n-1];
do
{
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++)
{
y = v[p+1];
z = v[p] += MX;
}
y = v[0];
z = v[n-1] += MX;
}
while (--rounds);
}
else if (n < -1) /* Decoding Part */
{
n = -n;
rounds = 6 + 52/n;
sum = rounds*DELTA;
y = v[0];
do
{
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--)
{
z = v[p-1];
y = v[p] -= MX;
}
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
}
while (--rounds);
}
}
这个加密和解密代码是在一起,根据你传入函数的n来决定是加密还是解密。网上也有其他版本的,但是我仔细区分了一下,发现别的有点小怪,其实这个也挺怪的,但是好像维基百科就是用的这个。
和TEA、XTEA一样,那两个常量依旧在,delta和rounds,我们传入了三个参数,第一个v是明文的数组,n是明文的数组长度,单位为字节,正数是加密,负数是解密。key是密钥数组。TEA系列的加密算法密钥和明文应该都是将数据分开,放入一个数组中的。
rounds = 6 + 52 / n 。这个公式的含义是,对于给定的数据块长度,根据公式计算出加密轮数rounds,以便在加密过程中执行足够的轮数,达到较高的安全性。
TEA算法使用128位密钥,XTEA算法使用128位或者更长的256位密钥,XXTEA算法使用128bit的密钥对以32bit为单位的信息块进行加密,就是数组有四个元素,每个元素4字节。但是网络上关于XXTEA算法的密钥长度也不是很统一。维基百科上是128bit长度。
z = v[p] += MX,C语言中计算表达式是从右往左边执行,所以是先计算MX的值,MX已经宏定义,然后赋值给v[p],再将v[p]赋值给z。
v的明文数组,也是每个元素的长度为32bit。