PCGRNG and ChaCha20 for esp32c3
Find a file
2026-03-21 19:31:31 +03:00
.cargo Esp32c3 port 2026-03-20 20:24:49 +03:00
src Tests 2026-03-21 19:31:31 +03:00
.clippy.toml Esp32c3 port 2026-03-20 20:24:49 +03:00
.gitignore Tests 2026-03-21 19:31:31 +03:00
build.rs Esp32c3 port 2026-03-20 20:24:49 +03:00
Cargo.lock Esp32c3 port 2026-03-20 20:24:49 +03:00
Cargo.toml Esp32c3 port 2026-03-20 20:24:49 +03:00
chacharng.txt Tests 2026-03-21 19:31:31 +03:00
chacharng1.txt Tests 2026-03-21 19:31:31 +03:00
diehard_count.py Tests 2026-03-21 19:31:31 +03:00
LICENSE Tests 2026-03-21 19:31:31 +03:00
myrng.txt Esp32c3 port 2026-03-20 20:24:49 +03:00
oficrng.txt Esp32c3 port 2026-03-20 20:24:49 +03:00
README.md Tests 2026-03-21 19:31:31 +03:00
rust-toolchain.toml Esp32c3 port 2026-03-20 20:24:49 +03:00

gena

use rand_core::{SeedableRng, TryRng};
use slow_crypto_rng::SlowCryptoRng;

let seed = [42u8; 32]; // 256-битный ключ
let mut rng = SlowCryptoRng::from_seed(seed);

let random_u64: u64 = rng.try_next_u64().unwrap();
println!("CSPRNG output: 0x{:016x}", random_u64);

Описание

gen - это 2 генератора случайных чисел для встроенных систем на базе RISC-V, ARM и E2K chacha20 - сравнительно медленный криптостойкий генератор случайных чисел, хорошо зарекомендовавший себя в ядре Linux pcg (XSL-RR-RR) - очень быстрый генератор, который не считается криптостойким, хотя и имеет огромный период повторения Оба генератора проходят тесты diehard

Конкретно этот репозиторий содержит файлы, необходимые для запуска генератора на ESP32C3 (потому что они у меня больше всего в наличии) В данной реализации реализация pcg имеет отсклонение от идеального генератора 0.0024 от 0.5, chacha20 0.069 от 0.5

Установка

Добавьте в Cargo.toml

Быстрый старт

Генерация случайных чисел

use rand_core::{SeedableRng, TryRng};
use slow_crypto_rng::SlowCryptoRng;

fn main() {
    // Инициализация по 32-байтному сиду (256-битный ключ)
    let seed = b"MySuperSecretSeed123456789012";
    let mut rng = SlowCryptoRng::from_seed(*seed);
    
    // Генерация u32 / u64
    let n32: u32 = rng.try_next_u32().unwrap();
    let n64: u64 = rng.try_next_u64().unwrap();
    
    // Заполнение буфера байтами
    let mut buffer = [0u8; 32];
    rng.try_fill_bytes(&mut buffer).unwrap();
    
    println!("Random bytes: {:02x?}", buffer);
}

Генерация криптографического ключа

fn generate_aes_key() -> [u8; 32] {
    use rand_core::{SeedableRng, TryRng};
    use slow_crypto_rng::SlowCryptoRng;
    use std::time::{SystemTime, UNIX_EPOCH};
    
    // ⚠️ В продакшене используйте настоящий источник энтропии!
    let seed = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_nanos()
        .to_le_bytes()[0..32]
        .try_into()
        .unwrap();
    
    let mut rng = SlowCryptoRng::from_seed(seed);
    let mut key = [0u8; 32];
    rng.try_fill_bytes(&mut key).unwrap();
    key
}

Сравнение с альтернативами

Генератор Криптостойкость Скорость (u64) Зависимости
SlowCryptoRng ChaCha20-Poly1305 1.13 M/s rand_core
PcgRng Хорошая статистическая случайность, не криптостойкий 1.24 M/s rand_core
esp_hal ChaCha20-Poly1305 1.16 платформенные

🔗 Совместимость

Поддерживаемые платформы

Платформа Статус Примечание
x86_64-unknown-linux-gnu Полная Тестировано на CI
aarch64-unknown-linux-gnu Полная Без NEON-оптимизаций
e2k Gjkyfz Не поддерживает rustc, работает в режиме трансляции с x86
riscv64gc-unknown-linux-gnu Экспериментально Требуется тестирование
e2k Экспериментально Не поддерживает rustc, работает в режиме трансляции с x86

Версии зависимостей

[dependencies]
rand_core = "0.10.0"

Помощь

  • терпите