No description
| src | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
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
Установка
Добавьте в 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
}
Реализация nonce для шифрования
fn generate_nonce(rng: &mut SlowCryptoRng) -> [u8; 12] {
let mut nonce = [0u8; 12];
rng.try_fill_bytes(&mut nonce).unwrap();
nonce
}
// Использование с ChaCha20Poly1305 (через крейт `chacha20poly1305`)
use chacha20poly1305::{ChaCha20Poly1305, KeyInit, Aead};
let key = Key::from([0u8; 32]);
let cipher = ChaCha20Poly1305::new(&key);
let nonce = generate_nonce(&mut rng); // 96-битный nonce
let ciphertext = cipher.encrypt(&nonce.into(), b"Secret message".as_ref())?;
Сравнение с альтернативами
| Генератор | Криптостойкость | Скорость (u64) | Зависимости |
|---|---|---|---|
| SlowCryptoRng | RFC 8439 | 21 M/s | rand_core |
rand_chacha |
ChaCha12/20 | 180 M/s | rand_core, оптимизации |
rand::rngs::StdRng |
❌ (статистический) | 320 M/s | rand |
OsRng |
(системный) | ~2 µs/вызов | платформенные |
Когда использовать этот модуль
Подходит:
- Прототипирование криптографических протоколов
- Образовательные цели и изучение ChaCha20
- Сценарии, где важна читаемость и аудит кода
- Тестирование с детерминированными сидами
❌ Не подходит:
- Высоконагруженные серверы (выберите
rand_chacha) - Встраиваемые системы с ограниченной памятью
- Сценарии, требующие аппаратного ускорения (AES-NI, ARM Crypto)
Оптимизации (для продвинутых)
Если нужна производительность без потери совместимости:
// 1. Включите оптимизации в Cargo.toml
[profile.release]
lto = "fat"
codegen-units = 1
// 2. Используйте target-cpu=native при компиляции
RUSTFLAGS="-C target-cpu=native" cargo build --release
// 3. Рассмотрите fork с SIMD-оптимизациями (AVX2/NEON)
// (требуется отдельная реализация quarter_round)
🔗 Совместимость
Поддерживаемые платформы
| Платформа | Статус | Примечание |
|---|---|---|
x86_64-unknown-linux-gnu |
Полная | Тестировано на CI |
aarch64-unknown-linux-gnu |
Полная | Без NEON-оптимизаций |
wasm32-unknown-unknown |
Полная | Pure Rust, нет зависимостей от ОС |
x86_64-pc-windows-msvc |
Полная | Тестировано на Windows 11 |
riscv64gc-unknown-linux-gnu |
Экспериментально | Требуется тестирование |
Версии зависимостей
[dependencies]
rand_core = "0.10.0"
Помощь
- терпите