PCGRNG and ChaCha20 for esp32c3
| .cargo | ||
| src | ||
| .clippy.toml | ||
| .gitignore | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| chacharng.txt | ||
| chacharng1.txt | ||
| diehard_count.py | ||
| LICENSE | ||
| myrng.txt | ||
| oficrng.txt | ||
| README.md | ||
| rust-toolchain.toml | ||
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"
Помощь
- терпите