LOKI97加密解密
澳大利亚分组密码 - 128位分组、可变密钥长度的AES候选算法
安全提示
LOKI97曾是AES候选算法,但未被选为标准。对于需要高安全性的新应用,建议使用AES(Rijndael)。
关于LOKI97
LOKI97是由Lawrie Brown和Josef Pieprzyk于1997年设计的对称密钥分组密码。它作为高级加密标准(AES)竞赛的候选算法提交,代表了澳大利亚开发的早期LOKI89和LOKI91密码的演进。
该密码对128位数据块进行操作,支持128、192或256位的密钥大小。它采用16轮Feistel网络结构,具有基于S盒和置换的复杂轮函数,旨在提供强大的差分和线性密码分析抵抗能力。
主要特点
- 128位分组大小,符合现代安全标准
- 灵活的密钥大小:128、192或256位
- 16轮Feistel结构确保充分的数据混淆
- 设计用于抵抗差分和线性密码分析
- 澳大利亚开发的LOKI密码家族成员
LOKI家族历史
- LOKI89:1989年设计的原始密码,采用64位分组和64位密钥。
- LOKI91:解决LOKI89弱点的改进版本。
- LOKI97:采用128位分组的最终演进版,提交至AES竞赛。
加密模式
- CBC: 密码分组链接 - 每个分组在加密前与前一个密文分组异或。提供强安全性。需要IV。
- ECB: 电子密码本 - 每个分组独立加密。简单但会暴露数据模式。不推荐用于大多数场景。
- CFB: 密码反馈 - 将分组密码转换为流密码。自同步,可处理部分块。
- OFB: 输出反馈 - 独立于明文生成密钥流。无错误传播。
- RAW: 原始分组 - 直接单块加密,无链接模式。不需要IV。仅用于单个128位块。
算法结构
LOKI97采用16轮Feistel网络结构。每轮处理一个128位分组,将其分为两个64位半块(L和R)。
密钥扩展
256位主密钥通过f函数和常量DELTA(源自黄金分割比)扩展为48个子密钥(SK[0]到SK[47])。对于128位或192位密钥,密钥材料会被复制以填充256位密钥寄存器,然后再进行扩展。
轮函数
每轮应用:L' = R + SK[3i],R' = L XOR f(R + SK[3i], SK[3i+1], SK[3i+2])。加法运算为模2^64。
f函数
核心f函数f(A, B)由四层组成:
- KP(密钥控制置换):根据B中的控制位从A中选择比特
- Sa(S盒层a):使用两种类型的八个并行S盒查找(S1:13→8位,S2:11→8位)
- P(置换):使用8×8位交织模式的64位置换
- Sb(S盒层b):使用B中额外密钥材料的第二轮八个S盒查找
S盒
S1有8192个条目(13位输入→8位输出),S2有2048个条目(11位输入→8位输出)。两者分别使用GF(2^13)和GF(2^11)中的立方运算计算,采用特定的生成多项式以确保强非线性。
解密过程
解密使用相同的结构,但子密钥以相反顺序应用(从SK[47]到SK[0]),并使用减法代替加法。
算法比较
| 算法 | 密钥长度 | 分组大小 | 安全性 | 速度 |
|---|---|---|---|---|
| LOKI97 | 128/192/256 bits | 128 bits | 良好 | 中等 |
| AES | 128/192/256 bits | 128 bits | 优秀 | 快速 |
| Serpent | 128/192/256 bits | 128 bits | 优秀 | 中等 |
| DES | 56 bits | 64 bits | 弱 | 快速 |
安全注意事项
- LOKI97提供良好的安全性,目前未发现针对完整密码的实际攻击
- 128位分组大小符合现代安全要求
- 虽然未被选为AES,但LOKI97在密码学上仍然可靠
- 对于新应用,建议使用AES作为国际标准
使用场景
- 传统系统兼容性和历史研究
- 密码学教育和算法研究
- 与其他AES候选算法的比较分析
- 需要澳大利亚开发的密码学的应用