No description
Find a file
2026-03-18 21:02:05 +03:00
src Added PCG-XSL-RR algorythm, refactored some code 2026-03-10 20:46:13 +03:00
.gitignore Init commit 2026-03-05 22:54:32 +03:00
Cargo.lock Added PCG-XSL-RR algorythm, refactored some code 2026-03-10 20:46:13 +03:00
Cargo.toml Added PCG-XSL-RR algorythm, refactored some code 2026-03-10 20:46:13 +03:00
LICENSE added readme and license 2026-03-18 21:02:05 +03:00
README.md added readme and license 2026-03-18 21:02:05 +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

Установка

Добавьте в 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"

Помощь

  • терпите