paim-creater/prng

GitHub: paim-creater/prng

基于代数度驱动方法设计的高性能伪随机数生成器,提供密码学安全与非密码学两种方案,以远超 ChaCha20 的吞吐量满足从安全加密到科学计算的随机数需求。

Stars: 1 | Forks: 0

# Bolt & Tempest:代数度驱动的 PRNG 设计 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Language: C99](https://img.shields.io/badge/Language-C99-blue.svg)](src/) [![Benchmark](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/paim-creater/prng/actions/workflows/benchmark.yml) [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/master/media/badge.svg)](https://github.com/rust-cc/awesome-cryptography-rust) 两款通过**代数度驱动方法论**设计的高性能伪随机数生成器 —— 首先以 GF(2) 上的代数度 (deg) 为目标,然后反向工程出最优的原语组合。 | 平台 | 状态 | |----------|--------| | x86-64 (GCC/Clang/MSVC) | ✅ 完全支持 | | ARM64 (Apple M / Cortex-A) | ✅ 完全支持 | | RISC-V 64 | ✅ 完全支持 | | MSVC | ✅ 通过 `src/platform.h` 支持 | ## 概览 | 算法 | 类型 | 吞吐量 | 安全性 | 测试状态 | |-----------|------|-----------|----------|-------------| | **ADC-Bolt** | 非密码学 PRNG | **70.3 Gbit/s** (12.1× ChaCha20) | deg=2 (非密码学) | NIST ✅ TestU01 ✅ PractRand ✅ | | **Tempest v3** | CSPRNG | **17.7 Gbit/s** (3.0× ChaCha20) | deg≥256 (已证明), DP(1)≤2⁻³ (已证明) | NIST ✅ TestU01 ✅ PractRand 1 TiB ✅ | | **Tempest v3 AVX-512** | CSPRNG (SIMD) | **65.4 Gbit/s** (11.3× ChaCha20) | deg≥256 | NIST ✅ TestU01 ✅ PractRand ✅ | ## 快速开始 ``` git clone https://github.com/paim-creater/prng.git && cd prng make && make bench ``` 预期输出: ``` ============================================ Bolt & Tempest — Throughput Benchmark ============================================ ADC-Bolt: 62753 Mbit/s (62.8 Gbit/s) Tempest v3: 17700 Mbit/s (17.7 Gbit/s) [provable degree, DP bound] ============================================ ``` ### 直接使用(单头文件) 复制一个文件即可 —— 无需构建系统: ``` #include "prng_single_header.h" // Non-crypto: games, Monte Carlo, ML adcbolt_state rng; adcbolt_seed(&rng, 42); double x = adcbolt_double(&rng); int dice = adcbolt_range(&rng, 1, 6); // Cryptographic: keys, tokens, authentication tempest_state csprng; tempest_init(&csprng, key, nonce); uint64_t token = tempest_u64(&csprng); ``` ### Python ``` import prng rng = prng.ADC_Bolt(seed=42) print(rng.randint(1, 6)) csprng = prng.Tempest(key=bytes(32), nonce=bytes(16)) print(csprng.hex(16)) ``` ## 设计方法论 传统的 PRNG 设计遵循:*选择结构 → 测试 → 增加轮次*。我们反其道而行之: **首先确定目标代数度 (deg),然后反向工程原语。** 关键指标是 **deg-per-op** —— 每次非线性操作(AND 门、ADD 进位或 MULX)产生的代数度收益。ADC-Bolt 使用 ADD+ADD(deg-per-op = 1.0,2c 延迟)。Tempest v3 使用 AND 混合级联(每 4 阶段链 deg ×16,4c 延迟)。 ### ADC-Bolt (70.3 Gbit/s) 用**进位链双加法**(ADD+ADD,2 周期延迟)替代 MULX 乘法(3 周期延迟)。具有相同的代数度 (deg=2),更短的关键路径,吞吐量比 MULX 基准**高出 52%**。 ``` // Core nonlinearity: carry-chain provides deg=2 at 2c latency z = (z + u) + v; // majority carry = quadratic over GF(2) ``` ### Tempest v3 (纯 GF(2),可证明的度数增长) **代数保证:** 2 轮后,输出 deg ≥ 256,XL 复杂度 ≥ 2³⁴⁵(启发式)。所有非线性均通过 AND(GF(2) 乘法)实现 —— 移除了整数 ADD/CMUL。 1. **纯 GF(2) 轮函数** —— 仅包含 XOR、ROTL、AND 操作(代数上可分析) 2. **4 阶段 AND 混合级联** —— 每个阶段使代数度翻倍(由归纳法证明) 3. **跨字 XOR-ROT 扩散** —— 基于快照,所有 4 个操作并行 4. **双输出** —— 通过状态置换每轮输出 2×64 位 ## 统计测试 两种算法均已通过**所有**应用的统计测试: | 测试套件 | 测试数 | ADC-Bolt | Tempest v3 | |------------|-------|----------|-------------------| | NIST SP 800-22 | 15 个系列 | ✅ 15/15 | ✅ 15/15 | | TestU01 SmallCrush | 15 | ✅ 通过 | ✅ 通过 | | TestU01 Rabbit | 40 | ✅ 通过 | ✅ 通过 | | TestU01 Alphabit | 17 | ✅ 通过 | ✅ 通过 | | TestU01 BigCrush | 160 | ✅ 通过 (1小时39分) | ✅ 通过 (3小时20分) | | TestU01 Crush | 144 | ✅ 通过 (12小时46分) | ✅ 通过 (23分) | | PractRand | — | ✅ 1 TiB, 354 组 | ✅ 1 TiB, 354 组, 0 异常 | 完整测试日志:[`results/`](results/) ## 性能 ### 参考平台 (AMD Zen 4) | 算法 | 轮次 | 时间 | 吞吐量 | |-----------|--------|------|------------| | ADC-Bolt | 2×10⁸ | 182 ms | 70.3 Gbit/s | | Tempest v3 | 5×10⁷ | 325 ms | 17.7 Gbit/s | | ChaCha20 (标量) | 2×10⁸ | — | 5.8 Gbit/s | ### 各架构预测性能 | CPU | ADC-Bolt | Tempest v3 | 关键因素 | |-----|----------|------------|------------| | **Apple M4 Pro/Max** 🥇 | 85–95 Gbit/s | 16–18 Gbit/s | UMULL=1c (=ADD 延迟) | | AMD Zen 5 | 75–82 Gbit/s | 13–15 Gbit/s | IPC 比 Zen 4 高 15% | | **AMD Zen 4** | **70.3** ✅ | **17.7** ✅ | 参考平台 | | Intel Arrow Lake | 75–85 Gbit/s | 12–14 Gbit/s | 更高时钟频率 (5.7 GHz) | | Intel Raptor Lake | 60–70 Gbit/s | 10–12 Gbit/s | 上一代 | | ARM Cortex-X4 | 55–65 Gbit/s | 10–13 Gbit/s | 移动端散热限制 | ### 在您的硬件上复现 ``` git clone https://github.com/paim-creater/prng.git && cd prng gcc -O3 -march=native -o benchmark benchmark.c src/adcbolt.c src/tempest_v3.c -I. ./benchmark ``` 然后[提交您的结果](https://github.com/paim-creater/prng/issues/new?template=benchmark_result.md)到社区数据库! | 贡献者 | CPU | ADC-Bolt | Tempest v3 | |-------------|-----|----------|------------| | [提交您的结果 →](https://github.com/paim-creater/prng/issues/new?template=benchmark_result.md) | — | — | — | | [@paim-creater](https://github.com/paim-creater) | Ryzen 9 8940HX (Zen 4) | 70.3 Gbit/s | 17.7 Gbit/s | | [GitHub Actions CI](https://github.com/paim-creater/prng/actions) | Xeon E5 v4 | 8.6 Gbit/s | 4.6 Gbit/s | ## 仓库结构 ``` . ├── README.md ├── LICENSE ← MIT ├── CONTRIBUTING.md ├── CMakeLists.txt ← CMake build (MSVC / Xcode / Make / Ninja) ├── Makefile ← One-click: make && make bench ├── prng_single_header.h ← Drop-in: copy one file, #include it ├── prng.py ← Python bindings ├── benchmark.c ← Throughput benchmark ├── test_bolt.c ← ADC-Bolt self-test ├── test_tempest.c ← Tempest v3 self-test ├── examples/ │ ├── dice_roll.c ← Game dice roller │ ├── generate_token.c ← Secure API token │ └── monte_carlo.c ← π via Monte Carlo ├── src/ │ ├── platform.h ← Auto-detects x86-64 / ARM64 / RISC-V / MSVC │ ├── adcbolt.h ← ADC-Bolt API │ ├── adcbolt.c ← ADC-Bolt implementation │ ├── tempest_v3.h ← Tempest v3 API │ ├── tempest_v3.c ← Tempest v3 implementation │ ├── tempest_openssl.c ← OpenSSL 3.x Provider (EVP_RAND) │ ├── tempest_cuda_kernel.cu ← CUDA GPU RNG kernel │ ├── bitgen_tempest.c ← NumPy BitGenerator C extension │ └── _tempest_numpy.c ← NumPy bulk fill acceleration ├── tempest_rng.py ← ⭐ NumPy: random/normal/integers/shuffle (11 Gbit/s) ├── tempest_cuda.py ← GPU: CUDA-accelerated Monte Carlo ├── setup_bitgen.py ← Build script for NumPy BitGenerator ├── tempest-rs/ ← ⭐ Rust crate: RngCore + CryptoRng │ ├── Cargo.toml │ ├── src/lib.rs │ └── examples/pi_estimation.rs ├── results/ ← Full test logs │ ├── nist_tempest_v3_report.txt │ ├── smallcrush_tempest_v3.log │ ├── rabbit_tempest_v3.log │ ├── alphabit_tempest_v3.log │ ├── bigcrush_tempest_v3.log │ ├── crush_tempest_v3.log │ ├── practrand_tempest_v3_1tb.log │ └── (adcbolt counterparts) └── .github/ ├── workflows/benchmark.yml ← CI benchmark └── ISSUE_TEMPLATE/ ``` ## 快速验证 任何人都可以在一秒钟内验证实现是否正确: ``` #include "src/kat_tempest.h" tempest_state s; if (tempest_kat_verify(&s) == 0) { printf("Tempest v3: correct\n"); } ``` 这会运行一个已知答案测试(key={1,2,3,4}, nonce={5,6})并与参考输出进行核对。无需外部依赖,无需构建系统。 完整测试套件: ``` gcc -O3 -o test_self test_tempest.c src/tempest_v3.c -I. ./test_self ``` ## 统计测试结果 | 套件 | 测试数 | 结果 | |-------|-------|--------| | NIST SP 800-22 | 15/15 | ✅ 通过 | | TestU01 SmallCrush | 15 | ✅ 通过 | | TestU01 Rabbit | 40 | ✅ 通过 | | TestU01 Alphabit | 17 | ✅ 通过 | | TestU01 Crush | 144 | ✅ 通过 | | TestU01 BigCrush | 160 | ✅ 通过 | | PractRand | ≥354 (1 TiB) | ✅ 通过 | ## 安全性 Tempest v3 提供了代数度保证以及经验上有界的差分/线性抗性。 安全性指标分为**已证明**(数学推导)、**启发式**(依赖于标准假设)或**经验性**(通过实验测量)三类。 ### 纯 GF(2) 轮函数(代数上可分析) - **代数度**:r 轮后 deg ≥ 16^r(AND 度数倍增归纳法)。r = 2 轮后:deg ≥ 256 → XL 复杂度 ≥ 2³⁴⁵(Courtois-Pieprzyk 启发式) - **每比特 AND DP**:= 1/2(GF(2) 代数 —— AND 即 GF(2) 乘法) - **单轮 DP**:DP(1) ≤ 2^{-3}(已证明下界,a₁ ≥ 3 个活跃的 AND 字操作) - **多轮 DP**:DP(r) ≤ 2^{-3r}(在 Markov 密码假设下) - **线性偏差**:ε^{(2)} ≤ 2^{-22}(经验值,2×10¹⁰ 个样本) ### 经验性(标准密码学实践 —— 类似于 AES S 盒 DP) - **AND 混合扩散**:每级联覆盖 1→3→9→27→64 位(针对旋转常数 (31,53),(17,43),(7,23),(5,19) 测量) - **迭代 DP**:经验上与 2¹²⁸ 的安全边界一致 ### 设计基本原理 - **纯 GF(2) 操作**:所有非线性均通过 AND(GF(2) 乘法)实现 - **Weyl 每轮密钥**:抗滑动攻击(依赖于轮次的混合) - **双输出**:通过状态置换每轮输出 2×64 位 完整的安全分析请参见 [DESIGN.md](DESIGN.md)。 **NIST SP 800-90A/90B**:Tempest v3 被打包为一个完整的 DRBG(实例化/生成/再种子化/取消实例化),并带有符合 SP 800-90B 的熵源(RCT/APT 健康度测试 + Tempest 调节)。12 项工程验证测试通过。 **生态系统集成**:NumPy (tempest_rng.py, 11 Gbit/s)、OpenSSL 3.x Provider (TEMPEST-DRBG)、Rust rand crate (tempest-rs, RngCore + CryptoRng)、CUDA GPU kernel (tempest_cuda_kernel.cu, 并行蒙特卡洛)。 ## 构建选项 ### 使用 Make (Linux / macOS / MSYS2) ``` make # compile + run self-tests make test # build and run both test programs make benchmark # build benchmark binary make bench # build and run benchmark make clean # remove binaries ``` ### CMake (包含 MSVC 的所有平台) ``` mkdir build && cd build cmake .. cmake --build . ctest # run test_all ./benchmark # run benchmark ``` ### 手动编译 ``` # ADC-Bolt gcc -O3 -march=native -o test_bolt test_bolt.c src/adcbolt.c -I. # Tempest v3 gcc -O3 -march=native -o test_tempest test_tempest.c src/tempest_v3.c -I. # Benchmark gcc -O3 -march=native -o benchmark benchmark.c src/adcbolt.c src/tempest_v3.c -I. ``` ## 对比 ### 标量 CSPRNG | 算法 | 吞吐量 | 安全性 | 验证 | |-----------|-----------|----------|-------------| | **Tempest v3** | **17.7 Gbit/s** | deg≥256 (已证明), DP(1)≤2⁻³ (已证明) | TestU01 全部 5 个级别, PractRand 1 TiB | | ChaCha20 | 5.8 Gbit/s | 2²⁵⁶ | 15 余年的密码分析 | | AES-CTR DRBG (AES-NI) | 2–6 Gbit/s | 2²⁵⁶ | NIST 标准 | ### 非密码学 PRNG | 算法 | 吞吐量 | 状态更新 | TestU01 BigCrush | |-----------|-----------|-------------|-----------------| | RomuTrio | ~213 Gbit/s | 线性 | ❌ 在 2¹⁹ 字节后失败 | | wyrand | ~178 Gbit/s | 线性 | 部分通过 | | xoroshiro128+ | ~90 Gbit/s | 线性 | ❌ 存在部分失败 | | **ADC-Bolt** | **70.3 Gbit/s** | **非线性 (deg=2)** | ✅ 完全通过 | ## 引用 ``` @misc{bolt_tempest_2026, title = {Tempest v3 \& ADC-Bolt: Algebraic Degree-Driven PRNG Design}, author = {Tian Yuezhou}, year = {2026}, url = {https://github.com/paim-creater/prng}, } ``` ## 许可证 MIT —— 学术、商业和个人用途均免费。请参见 [LICENSE](LICENSE)。
标签:Bash脚本, C99, CSPRNG, SIMD, Vectored Exception Handling, 伪随机数生成器, 可视化界面, 客户端加密, 密码学, 手动系统调用, 逆向工具