2 个版本 (1 个稳定版)
1.0.0 | 2024年5月31日 |
---|---|
0.1.0 | 2024年1月4日 |
#1459 in 密码学
145KB
3K SLoC
WringTwistree
Wring 是一个整消息加密算法。这类似于分组密码,但块的大小可以是任意大的,大约 3 GiB(Rust 版本将在那里开始出现乘法溢出)。Wring 还可以用作长度保持的全或无变换。
Twistree 是一个哈希函数。它从数据块中构建两个树,在每个树的节点上运行压缩函数,并将结果与压缩函数结合。
这两个算法都是密钥相关的。密钥被转换为 96 个 16 位字,然后用于制作三个 S-box。密钥可以是任何字节字符串,包括空字符串。
特性
一个回合由四个操作组成
mix3Parts
操作将消息或块分成三等份并非线性混合。这提供了扩散和非线性。Wring 的回合数随着消息大小的增加而对数增长,以便扩散传播到整个消息。- 三个密钥相关的 8×8 S-box 提供了混淆和抵抗线性密码分析。
- 通过人口计数进行旋转可以防止积分和微分密码分析,因为它将差异移动到消息的另一个部分。
-
- 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-fixed
或 hashcoll-linear
。此选项在 Rust 实现中不可用。
使用 cargo
而不是 stack
运行 Rust 实现;选项相同,只是散列选项为 -h
。
Rust 二进制文件名为 wring-twistree
,可以使用 cargo install --path .
安装;Haskell 二进制文件名为 WringTwistree
,可以使用 stack install
安装。它们接受 --
后的选项。
测试向量
测试向量位于 test/Spec.hs
和 src/lib.rs
中。
依赖项
~6.5MB
~130K SLoC