1 个不稳定版本
使用旧的 Rust 2015
0.0.0 | 2018年6月17日 |
---|
#112 在 #rng
25KB
415 行
概述
如果我们能够默认使用成本适中的攻击抵抗随机生成器,会怎样?我们引入了 'Randen',一个新的具有安全保证的生成器;它在现实世界的基准测试中优于 MT19937、pcg64_c32、Philox、ISAAC 和 ChaCha8。这是通过 AES 硬件加速和大型 Feistel 置换实现的。
相关工作
AES-CTR(加密计数器)是一个众所周知且易于实现的生成器。它有两个已知的弱点
-
10 轮 128 位 AES 的已知密钥区分器 https://goo.gl/3xReB9。
-
没有前向安全性/防回溯:泄露当前状态让攻击者可以区分先前输出和随机输出。
NIST 800-90a r1 https://goo.gl/68Fwmv 是一个标准化的生成器,确保了防回溯,但速度不够快,不能用于通用生成器(比 AES 慢 5-10 倍)。
算法
Randen 生成器基于三个现有的组件
-
Reverie https://eprint.iacr.org/2016/886.pdf 是一个类似海绵的生成器,需要加密置换。它通过仅在每个缓冲区中使用单个置换来实现防回溯,改进了 "Provably Robust Sponge-Based PRNGs and KDFs"。
-
Simpira v2 https://eprint.iacr.org/2016/122.pdf 使用改进的通用 Feistel 网络和 2 轮 AES-128 函数构建最多 1024 位的置换。这个 Feistel 块洗牌比类型 2 循环洗牌更快,且对切片双团攻击的脆弱性更低。
-
"New criterion for diffusion property" https://goo.gl/mLXH4f 显示,这种改进的 Feistel 块洗牌可以扩展到 16 个分支,这允许更高效的 2048 位置换。
我们将它们结合起来,将更大的 Simpira 类似置换插入到 Reverie 中。
性能
实现针对 x86(Westmere)、POWER 8 和 ARM64。
x86 微基准测试:在紧密循环中生成随机位(cpb=每字节周期数,MAD=中值绝对偏差)
RNG | cpb | MAD |
---|---|---|
Randen | 1.54 | 0.002 |
pcg64_c32 | 0.78 | 0.003 |
mt19937_64 | 1.79 | 0.001 |
ChaCha8 | 3.02 | 0.003 |
ISAAC | 4.08 | 0.006 |
Philox | 4.70 | 0.003 |
/dev/urandom(ChaCha20) | 15.27 | 0.018 |
BCryptGenRandom(CTR-DRBG) | 16.80 | 0.009 |
x86 现实世界基准测试(水库抽样)
RNG | cpb | MAD |
---|---|---|
Randen | 2.60 | 0.008 |
pcg64_c32 | 3.03 | 0.009 |
mt19937_64 | 2.82 | 0.009 |
ChaCha8 | 3.75 | 0.008 |
ISAAC | 4.46 | 0.014 |
Philox | 4.95 | 0.009 |
/dev/urandom(ChaCha20) | 13.46 | 0.017 |
BCryptGenRandom(CTR-DRBG) | 16.41 | 0.015 |
安全性
Randen 与随机不可区分,且具有防回溯性。有关更多细节和基准测试,请参阅 "Randen - fast backtracking-resistant random generator with AES+Feistel+Reverie"。
用法
make&&bin/randen_benchmark
请注意,此代码依赖于编译器的优化。当使用GCC 7.3编译时,每字节循环次数可能增加1.6倍,使用Clang 4.0.1时增加1.3倍。可以通过手动展开循环来减轻这种情况。
第三方实现/绑定
感谢Frank Denis让我们了解到这些第三方实现或绑定。请注意,该算法仍在审查中,可能会发生变化,但请随时联系或提出问题,我们也会添加您的。
作者: | 语言 | URL |
---|---|---|
Frank Denis | C | https://github.com/jedisct1/randen-rng |
这不是一个官方的Google产品。
lib.rs
:
Randen伪随机数生成器。
依赖项
~320-500KB