作者: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 位密钥,然后使用 CUDA 在 CPU 或 GPU 上运行 AES128 的 CTR 模式。然后生成一个随机的 128 位状态,并应用一个转换函数将其映射到目标张量值。这种方法基于 Parallel Random Numbers: As Easy as 1, 2, 3 (John K. Salmon, Mark A. Moraes, Ron O. Dror, and 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] Introduction to Modern Cryptography: Principles and Protocols (Chapman & Hall/CRC Cryptography and Network Security Series) 作者:Jonathan Katz 和 Yehuda Lindell