#tree-hash #hash #cipher #message #hashing #byte #data

bin+lib wring-twistree

整消息加密和树哈希

2 个版本 (1 个稳定版)

1.0.0 2024年5月31日
0.1.0 2024年1月4日

#1459 in 密码学

BSD-3-Clause

145KB
3K SLoC

Haskell 2K SLoC // 0.1% comments Rust 1K SLoC // 0.1% comments Cabal 92 SLoC // 0.0% comments Shell 39 SLoC // 0.2% comments

WringTwistree

Wring 是一个整消息加密算法。这类似于分组密码,但块的大小可以是任意大的,大约 3 GiB(Rust 版本将在那里开始出现乘法溢出)。Wring 还可以用作长度保持的全或无变换。

Twistree 是一个哈希函数。它从数据块中构建两个树,在每个树的节点上运行压缩函数,并将结果与压缩函数结合。

这两个算法都是密钥相关的。密钥被转换为 96 个 16 位字,然后用于制作三个 S-box。密钥可以是任何字节字符串,包括空字符串。

特性

一个回合由四个操作组成

  1. mix3Parts 操作将消息或块分成三等份并非线性混合。这提供了扩散和非线性。Wring 的回合数随着消息大小的增加而对数增长,以便扩散传播到整个消息。
  2. 三个密钥相关的 8×8 S-box 提供了混淆和抵抗线性密码分析。
  3. 通过人口计数进行旋转可以防止积分和微分密码分析,因为它将差异移动到消息的另一个部分。
  4.  
    • Wring 的回合常数,它取决于字节位置以及回合数,被添加到每个字节中,以防止滑动攻击并确保全零消息不会保持那种状态。
    • Twistree 运行反向 CRC 以使即将被丢弃的四个字节影响所有其他字节。

Rust

要运行程序,键入 cargo run。第一次运行它时,Cargo 可能会下载约四分之一吉字节的数据,这是所有 crate 的索引。您还可以使用 cargo test 测试程序。

Haskell

您可以使用 stack ghci 在 REPL 中运行 WringTwistree,使用 stack run 编译和运行它,或使用其他 Stack 命令。您还可以使用 stack test 测试程序。

如果您使用 Cabal 进行开发,请编辑 package.yaml 以匹配您对 WringTwistree.cabal 的任何更改。

命令行选项

stack run -- -k key -e plaintext -o ciphertext 对文件进行加密。省略 -o ciphertext 则在原地进行加密。

stack run -- -k key -d ciphertext -o plaintext 对文件进行解密。省略 -o plaintext 则在原地进行解密。

stack run -- -k key -H plaintext -o hash 对文件进行散列。省略 -o hash 则将散列输出到标准输出。

stack run -- -c foo 运行类型为 foo 的密码分析,当前为相关密钥密码分析 relkey,积分密码分析 integral,散列冲突 hashcoll,或前者的变体 integral-fixedhashcoll-linear。此选项在 Rust 实现中不可用。

使用 cargo 而不是 stack 运行 Rust 实现;选项相同,只是散列选项为 -h

Rust 二进制文件名为 wring-twistree,可以使用 cargo install --path . 安装;Haskell 二进制文件名为 WringTwistree,可以使用 stack install 安装。它们接受 -- 后的选项。

测试向量

测试向量位于 test/Spec.hssrc/lib.rs 中。

依赖项

~6.5MB
~130K SLoC