作者:PyTorch 团队

伪随机数生成器是现代密码学的关键组成部分之一。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