现代密码学的关键组成部分之一是伪随机数生成器。Katz 和 Lindell 指出:“使用设计不当或不合适的随机数生成器常常会使一个好的加密系统容易受到攻击。必须特别注意使用专为密码学用途设计的随机数生成器,而不是‘通用’随机数生成器,后者可能适用于某些应用,但不能用于需要密码学安全的应用。”[1] 此外,大多数伪随机数生成器由于其顺序性质,难以扩展到大规模并行高性能计算。其他生成器则不满足密码学安全特性。
torchcsprng 是 PyTorch 的 C++/CUDA 扩展,它为 PyTorch 提供了 密码学安全伪随机数生成器。
torchcsprng 概述
历史上,PyTorch 只有两种伪随机数生成器实现:用于 CPU 的 Mersenne Twister 和用于 CUDA 的 Nvidia cuRAND Philox。尽管它们具有良好的性能特性,但都不适用于密码学应用。在过去的几个月中,PyTorch 团队开发了 torchcsprng 扩展 API。基于 PyTorch 的调度机制和操作符注册,它允许用户扩展 c10::GeneratorImpl 并实现自己的自定义伪随机数生成器。
torchcsprng 使用其生成器之一在 CPU 上生成一个随机的 128 位密钥,然后在 CPU 或 GPU 上使用 CUDA 以 CTR 模式 运行 AES128。这会生成一个随机的 128 位状态,并应用一个转换函数将其映射到目标张量值。这种方法基于 并行随机数:像 1、2、3 一样简单(John K. Salmon、Mark A. Moraes、Ron O. Dror 和 David E. Shaw,D. E. Shaw Research)。它使 torchcsprng 在 CPU 和 CUDA 上都具有密码学安全性和并行性。

由于 torchcsprng 是 PyTorch 扩展,它可在 PyTorch 可用的平台上使用(Windows-CUDA 支持将在未来几个月内提供)。
使用 torchcsprng
torchcsprng API 使用非常简单,并且与 PyTorch 随机数基础设施完全兼容
步骤 1:通过二进制分发安装
Anaconda
conda install torchcsprng -c pytorch
pip
pip install torchcsprng
步骤 2:像往常一样导入包,但添加 csprng
import torch
import torchcsprng as csprng
步骤 3:从 /dev/urandom 创建一个密码学安全伪随机数生成器
urandom_gen = csprng.create_random_device_generator('/dev/urandom')
并直接与现有 PyTorch 方法一起使用
torch.randn(10, device='cpu', generator=urandom_gen)
步骤 4:用 CUDA 进行测试
torchcsprng 生成器的优点之一是它们可以与 CPU 和 CUDA 张量一起使用
torch.randn(10, device='cuda', generator=urandom_gen)
torchcsprng 生成器的另一个优点是它们在 CPU 上是并行的,这与默认的 PyTorch CPU 生成器不同。
开始使用
开始使用 torchcsprng 最简单的方法是访问 GitHub 页面,您可以在其中找到安装和构建说明,以及更多操作示例。
祝好,
PyTorch 团队
[1] 《现代密码学导论:原理与协议》(Chapman & Hall/CRC 密码学与网络安全系列) 作者:Jonathan Katz 和 Yehuda Lindell