现代密码学的一个关键组件是伪随机数生成器。Katz 和 Lindell 指出,“使用设计不良或不合适的随机数生成器往往会使一个优秀的密码系统容易受到攻击。必须特别小心地使用专为密码学设计的随机数生成器,而不是‘通用’的随机数生成器,后者可能适用于某些应用,但不适用于需要密码学安全的场合。”[1] 此外,由于伪随机数生成器的顺序性质,大多数伪随机数生成器在大量并行高性能计算中扩展性较差。其他生成器不满足密码学安全属性。
torchcsprng 是 PyTorch 的 C++/CUDA 扩展,为 PyTorch 提供密码学安全的伪随机数生成器。
torchcsprng 概述
历史上,PyTorch 只有两种伪随机数生成器实现:CPU 上的梅森旋转和 Nvidia 的 cuRAND Philox 用于 CUDA。尽管性能良好,但它们都不适合加密应用。在过去几个月的时间里,PyTorch 团队开发了 torchcsprng 扩展 API。基于 PyTorch 调度机制和操作注册,它允许用户扩展 c10::GeneratorImpl 并实现自己的自定义伪随机数生成器。
torchcsprng 在 CPU 上使用其生成器之一生成一个随机的 128 位密钥,然后在 CPU 或 GPU 上运行 AES128 的 CTR 模式,无论是 CPU 还是 GPU 使用 CUDA。然后生成一个随机的 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 进行测试
火炬 csprng 生成器的优点之一是它们可以与 CPU 和 CUDA 张量一起使用:
torch.randn(10, device='cuda', generator=urandom_gen)
火炬 csprng 生成器的另一个优点是,与默认的 PyTorch CPU 生成器不同,它在 CPU 上并行。
开始使用
开始使用 torchcsprng 的最简单方法是访问 GitHub 页面,在那里您可以找到安装和构建说明,以及更多如何操作示例。
干杯,
PyTorch 团队
[1] 现代密码学导论:原理与协议(查普曼与霍尔/CRC 密码学与网络安全系列)作者:乔纳森·卡茨和耶胡达·林德尔