XXTEA(Corrected Block TEA)算法
XXTEA
本篇文章,我们接着来看TEA算法的升级版,这个实际上是XTEA算法的升级版,这也是TEA系列算法的最后一篇了,这个算法的祖孙三个就都结束了
算法概况
❝密码的设计者是剑桥计算机实验室的罗杰·李约瑟和大卫·惠勒,该算法在1998年10月的一份未发表的[需要澄清的]技术报告中提出(惠勒和李约瑟,1998年)。它不受任何专利的约束。【维基百科】
❞
加密过程
XXTEA加密过程(图片来源于维基百科)
这里偷懒了,直接借用一下维基百科里面的图片, 哈哈。
这个结构,相比于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); } }