20个版本
0.2.15 | 2024年3月17日 |
---|---|
0.2.14 | 2022年12月13日 |
0.2.12 | 2021年12月8日 |
0.2.11 | 2021年7月27日 |
0.2.3 | 2019年3月20日 |
#1066 in 密码学
用于 aegis
29KB
526 行
STHash
STHash是一种快速、带密钥的加密散列函数,旨在处理大型、可能不可信的数据。
另一方面,使用秘密密钥(或在此实现中,秘密种子)是强制性的。这不是一个通用散列函数。
STHash的典型用途是计算本地缓存的对象的密钥。
该构造依赖于
- 两个 ε-几乎 ∆-通用函数 NH 和 Poly1305 的组合。请参阅Adiantum论文,以了解此组合的合理性。
- cSHAKE函数作为XOF以推导NH、Poly1305和最终化密钥,以及KMAC生成最终标签。
当前代码是可移植的,用安全Rust编写,并且有很多优化空间。
然而,它已经在所有常见平台上始终比优化的BLAKE2bp和BLAKE3实现更快。
您可以期待未来版本将更快。
用法
use sthash::*;
use rand::{thread_rng, RngCore};
// This must be a random, secret seed.
let mut seed = [0u8; SEED_BYTES];
thread_rng().fill_bytes(&mut seed);
// The key constructor accepts an optional application name
// Different personalization strings produce different keys
// from the same `seed`.
let key = Key::from_seed(&seed, Some(b"Documentation example"));
// Another personalization string, such as the purpose of the
// `Hasher`, can be provided here as well.
let hasher = Hasher::new(key, None);
// Returns a 256-bit hash.
let h1 = hasher.hash(b"data");
// `Hasher` structures can safely be reused to hash more data.
let h2 = hasher.hash(b"data2");
基准测试
内置基准测试的测量结果,对1 Mb数据进行散列。使用cargo bench
命令获取您自己的数据。
与BLAKE3(来自blake3
)的比较
机器 | BLAKE3(μs) | STHash(μs) | 比率 |
---|---|---|---|
Apple M1, MacOS | 646 | 119 | 5.4 |
AMD Zen2, Ubuntu | 212 | 71 | 3.0 |
AMD Zen4 (Ryzen 7700), Ubuntu | 148 | 61 | 2.4 |
Core i9 2.9Ghz, MacOS | 226 | 86 | 2.6 |
ARMv8 (Freebox Delta), Debian Linux VM | 3729 | 646 | 5.8 |
与BLAKE2bp(来自blake2b-simd
)的比较
机器 | BLAKE2bp(μs) | STHash(μs) | 比率 |
---|---|---|---|
Core i9 2.9Ghz, MacOS | 391 | 95 | 4.1 |
Core i7 2.8Ghz, MacOS | 607 | 134 | 4.5 |
Xeon CPU E5-1650 v4 3.60GHz, Ubuntu Linux | 479 | 130 | 3.7 |
Xeon CPU E3-1245 V2 3.40GHz, OpenBSD VM | 2681 | 493 | 5.4 |
ARMv8 (Freebox Delta), Debian Linux VM | 2949 | 668 | 4.4 |
ARMv8 (Raspberry Pi 4b), Raspbian | 10496 | 3127 | 3.4 |
ARMv7 (Scaleway C1), Ubuntu Linux | 29402 | 7871 | 3.7 |
ARMv7 (Raspberry Pi 3b), Raspbian | 19596 | 4944 | 4 |
Atom C3955 2.10GHz (Scaleway Start1-XS), Linux | 3709 | 886 | 4.2 |
AMD FX-6300, CentOS Linux | 1812 | 737 | 2.5 |
AMD Zen4 (Ryzen 7700), Ubuntu | 278 | 61 | 4.5 |
与HMAC-SHA2(来自rust-crypto
)的比较
机器 | HMAC-SHA512(μs) | STHash(μs) | 比率 |
---|---|---|---|
Core i9 2.9Ghz, MacOS | 2280 | 95 | 24 |
Core i7 2.8Ghz, MacOS | 3233 | 134 | 24.1 |
Xeon CPU E5-1650 v4 3.60GHz, Ubuntu Linux | 2600 | 130 | 20 |
Xeon CPU E3-1245 V2 3.40GHz, OpenBSD VM | 6423 | 493 | 13 |
ARMv8 (Freebox Delta), Debian Linux VM | 4587 | 668 | 6.9 |
ARMv8 (Raspberry Pi 4b), Raspbian | 19864 | 3127 | 6.4 |
ARMv7 (Scaleway C1), Ubuntu Linux | 167670 | 7871 | 21.3 |
ARMv7 (Raspberry Pi 3b), Raspbian | 49309 | 4944 | 9.9 |
Atom C3955 2.10GHz (Scaleway Start1-XS), Linux | 7052 | 886 | 8 |
AMD FX-6300, CentOS Linux | 3700 | 737 | 5 |
算法
Km || Kp || Kn ← cSHAKE128(seed, c1)
Hp ← Poly1305(Kp, NH(Kn, pad128(M)))
H ← KMAC(Km, c2, pad64(|M|) || Hp)
NH
使用4次遍历和2的步长进行实例化。
M
以1 KB块处理,并在累积16个散列后(≡处理了16 KB的M
)使用Poly1305压缩结果NH散列。
c1
和 c2
是个性化字符串。
Kp
代表 Poly1305 随机密钥。在此上下文中,我们不需要与加密的随机数进行最终加法。
值以小端编码。
参考文献
- UMAC: 快速且安全的消息认证 (J. Black, S.Halevi, H.Krawczyk, T.Krovetz, 和 P. Rogaway)
- Poly1305-AES 消息认证码 (Daniel J. Bernstein)
- Adiantum: 针对入门级处理器的长度保持加密 (Paul Crowley 和 Eric Biggers)
- 短输出通用哈希函数及其在快速和安全的数据认证中的应用 (Yannick Seurin)
感谢
此 crate 基于 Paul Crowley 和 Eric Biggers 的工作。
依赖项
~175KB