TEA/XTEA/XXTEA加密解密
微型加密算法家族 - 轻量级对称分组密码
安全提示
TEA/XTEA/XXTEA是主要用于嵌入式系统和游戏的轻量级密码。对于高安全性应用,请使用AES替代。
关于TEA系列
TEA(Tiny Encryption Algorithm,微型加密算法)1994 年由剑桥大学计算机实验室的 David Wheeler 和 Roger Needham 设计。其最大特点是极端简洁:整个加密循环不超过 10 行 C 代码,却通过 32 轮费斯特尔式双轮运算实现了 64 位分组加密。魔法常数 δ = 0x9E3779B9(约等于黄金比例 φ × 2³²,φ ≈ 1.618)在每轮中被加入到累积和里,确保不出现弱密钥的不动点。
TEA 家族的演进源于对已发现漏洞的修复:XTEA(1997)通过重新设计密钥调度解决了 TEA 的相关密钥攻击问题,让四个 32 位密钥字在各轮中以不同方式置换。XXTEA(1998)进一步推广到可变长度分组,采用全消息费斯特尔混合技术。三个变体共用同样的 128 位密钥和以 δ 为基础的轮常数结构,但在安全性和块大小灵活性上差异显著。
算法比较
| 算法 | 分组大小 | 密钥长度 | 轮数 | 安全性 |
|---|---|---|---|---|
| TEA | 64 bits | 128 bits | 64 | 传统 |
| XTEA | 64 bits | 128 bits | 64 | 良好 |
| XXTEA | 可变(≥64位) | 128 bits | 可变(6+52/n) | 良好 |
主要特点
- TEA 核心循环仅 7 行 C 代码——公认最紧凑的可量产分组密码
- 128 位密钥分为四个 32 位字;XTEA/XXTEA 每轮以不同方式置换子密钥
- 32 个双轮(共 64 次单轮运算),以 δ = 0x9E3779B9 作为轮常数
- XXTEA 支持可变长度分组——无需补齐即可加密任意大小的数据
加密模式(仅TEA/XTEA)
- CBC: 密码块链接模式——每个 64 位 TEA/XTEA 分组在经历 32 个双轮运算之前,先与前一密文块异或。64 位 IV 使各块形成依赖链,不同位置的相同明文产生不同密文。
- ECB: 电子密码本模式——每个 64 位分组独立经过 32 个双轮运算处理。两个完全相同的 64 位明文块总是产生相同密文,数据结构规律容易被识别。仅适合单个数据块的加密场景。
- CFB: 密码反馈模式——TEA/XTEA 作为密钥流生成器,将前一密文块加密后与下一段明文异或。可将 64 位分组密码转化为字节粒度的流密码,适合长度不固定的游戏数据流。
- OFB: 输出反馈模式——密钥流通过对 IV 反复执行 TEA/XTEA 加密独立生成,与明文无关。错误不扩散特性意味着一个字节损坏仅影响一个字节的明文恢复——适合嵌入式遥测场景,要求错误局限范围内。
- RAW: 原始分组 - 直接单块加密,无链接模式。不需要IV。
安全注意事项
- 原始 TEA:David Wagner(1997)证明存在相关密钥攻击;当攻击者有能力选择相关密钥时,禁止使用 TEA——任何新实现都应改用 XTEA 或 XXTEA
- XTEA 修复了 TEA 的相关密钥漏洞,但 64 位分组宽度仍将安全上限限制在 2³² 个分组(约 32 GB)——超出此量后生日界碰撞概率显著上升
- XXTEA 的全消息混合需要至少两轮才能保证正确性;对极短分组(≤ 2 个字),混合步骤减少会削弱安全性——短数据至少应补齐到 3 个字(12 字节)
- 三个 TEA 变体均不适合新的通用应用;现代嵌入式系统应优先选用 ChaCha20 或 AES-128-CTR——TEA 家族仅保留用于兼容旧格式,或代码体积是首要约束的极端资源受限场景
常见用例
- Xbox 和 Xbox 360 游戏存档保护:微软原版 Xbox 内部使用 XTEA 对主机存档数据进行签名和验证,防止通过记忆卡篡改
- QQ 即时消息:腾讯早期 QQ 协议曾使用 XTEA 改进版对客户端与服务器之间的会话数据加密,已被 QQ 协议开源逆向工程项目记录
- Cocos2d-x 和 Unity 游戏资源加密:由于代码体积极小,TEA/XTEA 在游戏引擎中广泛用于混淆资源文件(纹理、音频、脚本),尤其适合精简版移动构建
- ROM 以千字节计量的微控制器和 FPGA 实现:TEA 的 7 行核心循环编译为 ARM Thumb-2 机器码不足 100 字节,在 Flash 极度受限的 MCU 上完全可行