XTEA加密算法原理学习
本文最后更新于188 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言

上一次学习了TEA加密算法,但是在做题的过程中,目前我还没遇到过TEA加密算法,倒是会遇到XTEA,所以这不得不去学了,最近发现加密算法实在是有点小多,而我还没学完。

XTEA加密算法自然是TEA加密算法的升级版本了,它的全称是 Extended Tiny Encryption Algorithm,既然是升级版本,它就会跟TEA算法很相似。

这个在B站也有相关视频:

【动画密码学】XTEA_哔哩哔哩_bilibili

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;
}   
    v[0] = v0;
    v[1] = v1;
}

关于解密的逻辑,我在TEA加密算法那篇文章里面说过了,在这里就不再多说了。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇