CoderTools

LOKI97加密解密

澳大利亚分组密码 - 128位分组、可变密钥长度的AES候选算法

安全提示

LOKI97曾是AES候选算法,但未被选为标准。对于需要高安全性的新应用,建议使用AES(Rijndael)。

LOKI97支持128位(16字节)、192位(24字节)或256位(32字节)密钥。
格式选项

关于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候选算法的比较分析
  • 需要澳大利亚开发的密码学的应用

参考资料