【密码学】一文读懂XXTEA

简介: 本篇文章,我们接着来看TEA算法的升级版,这个实际上是XTEA算法的升级版,这也是TEA系列算法的最后一篇了,这个算法的祖孙三个就都结束了

XXTEA(Corrected Block TEA)算法


$6J9P4Q3AM}8{I$W3RG0FLY.jpgXXTEA

本篇文章,我们接着来看TEA算法的升级版,这个实际上是XTEA算法的升级版,这也是TEA系列算法的最后一篇了,这个算法的祖孙三个就都结束了


算法概况

密码的设计者是剑桥计算机实验室的罗杰·李约瑟和大卫·惠勒,该算法在1998年10月的一份未发表的[需要澄清的]技术报告中提出(惠勒和李约瑟,1998年)。它不受任何专利的约束。【维基百科】


加密过程

6~5V4ZK]CV[QT4JH}Q@NMYG.pngXXTEA加密过程(图片来源于维基百科)

这里偷懒了,直接借用一下维基百科里面的图片, 哈哈。

这个结构,相比于TEA以及XTEA来说变化的还是比较的大, 并且这个没有限制输入的明文的长度,对任意长度都可以进行处理,不需要自己去做相关的链接操作。

首先,轮数输入的数据长度控制, rounds = 6 + 52 / length, 然后就是每轮的具体操作了,每轮操作的具体过程,参考上面的图,其中核心的控制有一个mx函数,具体函数如下:

fn mx(sum: u32, y: u32, z: u32, p: u32, e: u32, k: &Vec<u32>) -> u32 {
    ((z >> 5 ^ y << 2).wrapping_add(y >> 3 ^ z << 4)) ^ ((sum ^ y).wrapping_add(k[(p & 3 ^ e) as usize] ^ z))
}

好了,到这里整个过程就算讲完了,到这里TEA的系列也就都结束了, 希望各位读者大佬们看的开心。


代码实现

老样子了,咱们依然用rust来写一下这个算法。

const DELTA: u32 = 0x9E3779B9;
fn mx(sum: u32, y: u32, z: u32, p: u32, e: u32, k: &Vec<u32>) -> u32 {
    ((z >> 5 ^ y << 2).wrapping_add(y >> 3 ^ z << 4)) ^ ((sum ^ y).wrapping_add(k[(p & 3 ^ e) as usize] ^ z))
}
struct XXTEA {}
impl XXTEA {
    pub fn encrypt(v: &mut Vec<u32>, key: &Vec<u32>) -> Vec<u32> {
        let length: u32 = v.len() as u32;
        let n: u32 = length - 1;
        let mut e: u32;
        let mut y: u32;
        let mut z = v[n as usize];
        let mut sum: u32 = 0;
        let mut q: u32 = 6 + 52 / length;
        while q > 0 {
            sum = sum.wrapping_add(DELTA);
            e = sum >> 2 & 3;
            for p in 0..n {
                y = v[(p as usize) + 1];
                v[p as usize] = v[p as usize].wrapping_add(mx(sum, y, z, (p as u32), e, &key));
                z = v[p as usize];
            }
            y = v[0];
            v[n as usize] = v[n as usize].wrapping_add(mx(sum, y, z, n, e, &key));
            z = v[n as usize];
            q = q - 1;
        }
        return v.clone();
    }
    pub fn decrypt(v: &mut Vec<u32>, key: &Vec<u32>) -> Vec<u32> {
        let length: u32 = v.len() as u32;
        let n: u32 = length - 1;
        let mut e: u32;
        let mut y: u32 = v[0];
        let mut z;
        let q: u32 = 6 + 52 / length;
        let mut sum: u32 = q.wrapping_mul(DELTA);
        while sum != 0 {
            e = sum >> 2 & 3;
            let mut p: usize = n as usize;
            while p > 0 {
                z = v[p - 1];
                v[p] = v[p].wrapping_sub(mx(sum, y, z, (p as u32), e, &key));
                y = v[p];
                p = p - 1;
            }
            z = v[n as usize];
            v[0] = v[0].wrapping_sub(mx(sum, y, z, 0, e, &key));
            y = v[0];
            sum = sum.wrapping_sub(DELTA);
        }
        return v.clone();
    }
}
#[cfg(test)]
mod test {
    use crate::xxtea::XXTEA;
    #[test]
    fn test() {
        let result = XXTEA::encrypt(&mut vec![1, 2], &vec![3, 4, 5, 6]);
        println!("{:?}", result);
        let result = XXTEA::decrypt(&mut vec![3884816341, 1540776289], &vec![3, 4, 5, 6]);
        println!("{:?}", result);
    }
}


相关文章
|
算法 数据安全/隐私保护 C语言
XXTEA加密算法
XXTEA加密算法
697 0
|
网络协议 Android开发 数据安全/隐私保护
Android手机上使用Socks5全局代理-教程+软件
Android手机上使用Socks5全局代理-教程+软件
8659 2
|
存储 Java 关系型数据库
家政服务管理平台
家政服务管理平台
|
Web App开发 Rust 算法
【密码学】一文读懂ChaCha20
好久没写新的加密算法的原理了, 这次所选取的加密算法结构比较简单, 一起来看一下吧。
9410 1
【密码学】一文读懂ChaCha20
|
Rust 算法 数据安全/隐私保护
【密码学】一文读懂XTEA加密
本篇文章,我们来看一下上一次讲过的TEA加密算法的一个升级版XTEA, 相比于TEA, XTEA的安全性显然是更高的,其中的过程要比TEA稍微复杂一点点。
1485 0
【密码学】一文读懂XTEA加密
|
Rust 算法 Go
【密码学】一文读懂FNV Hash
FNV哈希全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出。它可以快速hash大量的数据并保持较小的冲突概率,适合hash一些相近的字符串比如IP地址、URL、文件名等等。目前FNV算法有三个版本,分别是: FNV-0(已废弃)、FNV-1以及FNV-1a。这三个算法的结构非常相似,因此呢,在这里就一块说了。
3755 0
【密码学】一文读懂FNV Hash
|
Rust 算法 安全
【密码学】一文读懂MurMurHash2
上次我们聊过了一代的MurMurHash算法,是的,我又来水文章了,今天呢,接着来聊一下二代的MurMurHash算法,二代算法的整体结构实际上和一代算法差不太多,只是对于每一轮数据的处理过程当中的运算有一些差异,算法的来源依然是来自于Google官网给提供的源码,对着源码看的结构,对于这个算法呢,有两个版本,一个是32位的,一个是64位的,对于32位的算法和64位的算法,区别在于两个初始的魔数不同,整体运算过程还是十分相似的。
2638 0
【密码学】一文读懂MurMurHash2
|
Rust 算法 安全
【密码学】一文读懂HMAC
本文将来聊一聊基于哈希函数的消息认证码,在此之前,先来科普一下什么是 「消息认证码」 (MAC), 先来看一个简单的栗子
2221 0
【密码学】一文读懂HMAC
|
Rust 算法 网络安全
【密码学】一文读懂CMAC
介于上一篇文章比较水,然后这个和上一篇也比较相似,CMAC是为了解决DAA当中安全性不足的问题而出现的,这个算法一共有三个密钥,K, K1, K2, 其中K1和K2可以由K导出,接下来就来一起看一下CMAC的具体过程吧,这一篇文章其实也不长。
4731 0
【密码学】一文读懂CMAC
|
Rust 算法 Go
【密码学】一文读懂MurMurHash3
本文应该是MurMurHash算法介绍的最后一篇,来一起看一下最新的MurMurHash算法的具体过程,对于最新的算法来说,整个流程和之前的其实也比较相似,这里从维基百科当中找到了伪代码,也就不贴出来Google官方给出的推荐代码了,先来看一下维基百科给出的伪代码,这里只有32位的伪代码。
2804 0
【密码学】一文读懂MurMurHash3