XTEA(eXtended TEA)加密算法
XTEA加密
本篇文章,我们来看一下上一次讲过的TEA加密算法的一个升级版XTEA, 相比于TEA, XTEA的安全性显然是更高的,其中的过程要比TEA稍微复杂一点点。
算法概况
❝XTEA密码的设计者是剑桥计算机实验室的戴维·惠勒和罗杰·李约瑟,该算法在1997年的一份未发表的技术报告中提出(李约瑟和惠勒,1997年)。
❞
算法描述
算法结构
具体加解密的过程如上图所示,这里不再具体的描述了,简单说一下他相比于TEA改了什么。
这里,根据维基百科给出的实现,相比于TEA, 这里多了一个轮数的概念,我们可以控制加密的轮数,一般情况下,这个轮数用32,如果轮数取32,那么就和TEA的轮数是一样的了。
然后这里,对于每一轮的操作,有一些改动,这里对于轮密钥的选择,不再是固定的,而是和SUM相关,并且增加了一些运算,我个人的理解,这个可以看做是密钥扩展算法,这个密钥扩展的过程没有提前运算,而是在运算当中扩展的。
好了这里就简单介绍完了,如果看懂了TEA,理解这个应该不难。
代码实现
依然用rust来写吧
const DELTA: u32 = 0x9E3779B9; struct XTEA {} impl XTEA { pub fn encrypt(num_rounds: u32, v: [u32; 2], k: [u32; 4]) -> [u32; 2] { let mut v0 = v[0]; let mut v1 = v[1]; let mut sum = 0u32; for _ in 0..num_rounds { v0 = v0.wrapping_add(((v1.wrapping_shl(4) ^ v1.wrapping_shr(5)).wrapping_add(v1)) ^ (sum.wrapping_add(k[(sum & 3) as usize]))); sum = sum.wrapping_add(DELTA); v1 = v1.wrapping_add(((v0.wrapping_shl(4) ^ v0.wrapping_shr(5)).wrapping_add(v0)) ^ (sum.wrapping_add(k[((sum >> 11) & 3) as usize]))); } return [v0, v1]; } pub fn decrypt(num_rounds: u32, v: [u32; 2], k: [u32; 4]) -> [u32; 2] { let mut v0 = v[0]; let mut v1 = v[1]; let mut sum = DELTA.wrapping_mul(num_rounds); for _ in 0..num_rounds { v1 = v1.wrapping_sub(((v0.wrapping_shl(4) ^ v0.wrapping_shr(5)).wrapping_add(v0)) ^ (sum.wrapping_add(k[((sum >> 11) & 3) as usize]))); sum = sum.wrapping_sub(DELTA); v0 = v0.wrapping_sub(((v1.wrapping_shl(4) ^ v1.wrapping_shr(5)).wrapping_add(v1)) ^ (sum.wrapping_add(k[(sum & 3) as usize]))); } return [v0, v1]; } } #[cfg(test)] mod test { use crate::xtea::XTEA; #[test] fn test() { let result = XTEA::encrypt(32, [1, 2], [2, 3, 4, 5]); println!("{:?}", result); let result = XTEA::decrypt(32, result, [2, 3, 4, 5]); println!("{:?}", result); } }