#random #crypto

randen

Randen 是一个快速、防回溯的 CSPRNG

1 个不稳定版本

使用旧的 Rust 2015

0.0.0 2018年6月17日

#112#rng

Apache-2.0

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 生成器基于三个现有的组件

  1. Reverie https://eprint.iacr.org/2016/886.pdf 是一个类似海绵的生成器,需要加密置换。它通过仅在每个缓冲区中使用单个置换来实现防回溯,改进了 "Provably Robust Sponge-Based PRNGs and KDFs"。

  2. Simpira v2 https://eprint.iacr.org/2016/122.pdf 使用改进的通用 Feistel 网络和 2 轮 AES-128 函数构建最多 1024 位的置换。这个 Feistel 块洗牌比类型 2 循环洗牌更快,且对切片双团攻击的脆弱性更低。

  3. "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