We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Создание собственных криптографических протоколов в Termux с использованием libsodium и Rust

Подробное руководство по разработке криптографических протоколов в Termux с помощью библиотеки libsodium и языка Rust. Установка, настройка среды, примеры кода и лучшие практики.

Termux – это полнофункциональная Linux‑среда для Android, позволяющая разрабатывать и запускать сложные программы непосредственно на мобильном устройстве. В сочетании с современным языком программирования Rust и проверенной временем криптографической библиотекой libsodium вы получаете мощный набор инструментов для создания собственных защищённых протоколов.

Подготовка окружения в Termux

Для начала необходимо установить базовые пакеты, компиляторы и инструменты сборки.

pkg update && pkg upgrade
pkg install git clang make rust
pkg install libsodium-dev

Команда rust в Termux автоматически ставит rustup, cargo и актуальный компилятор rustc. После установки проверьте версии:

rustc --version
cargo --version
sodium-config --version

Создание проекта на Rust

Создадим новый проект и подключим libsodium-sys – официальные биндинги к libsodium.

cargo new secure_proto
cd secure_proto

Отредактируем файл Cargo.toml, добавив зависимости:

[dependencies]
libsodium-sys = "0.2"
hex = "0.4"

Биндинги libsodium-sys предоставляют низкоуровневый доступ к функциям библиотеки. Для более «Rust‑friendly» обёртки можно использовать libsodium crate, но в Termux удобнее работать напрямую.

Пример реализации простого протокола

В качестве демонстрации реализуем протокол, который генерирует пару ключей, производит обмен публичными ключами, а затем шифрует и расшифровывает сообщение с помощью crypto_box (curve25519 + XSalsa20‑Poly1305).

Создайте файл src/main.rs со следующим содержимым:

use libsodium_sys::;
use std::ptr;
use hex;

fn main() {
    // Инициализация libsodium
    unsafe { if sodium_init() == -1 { panic!("libsodium init failed"); } }

    // Размеры ключей и nonce согласно libsodium
    const PUBLIC_KEY_LEN: usize = crypto_box_PUBLICKEYBYTES as usize;
    const SECRET_KEY_LEN: usize = crypto_box_SECRETKEYBYTES as usize;
    const NONCE_LEN: usize = crypto_box_NONCEBYTES as usize;
    const MAC_LEN: usize = crypto_box_MACBYTES as usize;

    // Генерация ключевой пары для «Alice»
    let mut alice_pk = [0u8; PUBLIC_KEY_LEN];
    let mut alice_sk = [0u8; SECRET_KEY_LEN];
    unsafe { crypto_box_keypair(alice_pk.as_mut_ptr(), alice_sk.as_mut_ptr()); }

    // Генерация ключевой пары для «Bob»
    let mut bob_pk = [0u8; PUBLIC_KEY_LEN];
    let mut bob_sk = [0u8; SECRET_KEY_LEN];
    unsafe { crypto_box_keypair(bob_pk.as_mut_ptr(), bob_sk.as_mut_ptr()); }

    // Сообщение, которое будем шифровать
    let message = b"Привет, Bob! Это Alice.";
    let mut ciphertext = vec![0u8; message.len() + MAC_LEN];

    // Генерация nonce (одноразового числа)
    let mut nonce = [0u8; NONCE_LEN];
    unsafe { randombytes_buf(nonce.as_mut_ptr() as mut _, NONCE_LEN); }

    // Шифрование: Alice использует свой secret key и Bob's public key
    let rc = unsafe {
        crypto_box_easy(
            ciphertext.as_mut_ptr(),
            message.as_ptr(),
            message.len() as u64,
            nonce.as_ptr(),
            bob_pk.as_ptr(),
            alice_sk.as_ptr(),
        )
    };
    if rc != 0 { panic!("Encryption failed"); }

    // Вывод зашифрованного сообщения в hex-формате
    println!("Ciphertext: {}", hex::encode(&ciphertext));

    // Дешифрование: Bob использует свой secret key и Alice's public key
    let mut decrypted = vec![0u8; message.len()];
    let rc = unsafe {
        crypto_box_open_easy(
            decrypted.as_mut_ptr(),
            ciphertext.as_ptr(),
            ciphertext.len() as u64,
            nonce.as_ptr(),
            alice_pk.as_ptr(),
            bob_sk.as_ptr(),
        )
    };
    if rc != 0 { panic!("Decryption failed"); }

    println!("Decrypted message: {}", String::from_utf8_lossy(&decrypted));
}

Соберите и запустите программу:

cargo build --release
./target/release/secure_proto

Вы увидите зашифрованные данные в виде шестнадцатеричной строки и оригинальное сообщение после расшифровки.

Тестирование и отладка в Termux

  • Для отладки используйте println!() и проверяйте вывод с помощью logcat или просто в терминале.
  • Если вы планируете кроссплатформенную работу, убедитесь, что в android‑манифесте указаны разрешения на доступ к файловой системе, если храните ключи.
  • Для профилирования полезен cargo bench и инструменты perf (устанавливаются через pkg install perf).

Рекомендации по безопасности

  • Всегда генерируйте nonce случайным образом и не переиспользуйте его с тем же набором ключей.
  • Храните закрытые ключи в защищённом хранилище (например, Keystore Android) и избегайте их вывода в логах.
  • Регулярно обновляйте libsodium до последней версии, доступной в репозитории Termux.
  • Проводите статический анализ кода с помощью cargo audit и проверяйте уязвимости зависимостей.

Заключение

Комбинация Termux, Rust и libsodium открывает широкие возможности для разработки надёжных криптографических протоколов прямо на мобильных устройствах. Вы получили пошаговое руководство от установки среды до реализации и тестирования собственного протокола обмена зашифрованными сообщениями.

Если вам требуется более глубокая экспертиза, аудит безопасности или разработка кастомных криптографических решений, команда RybinskLab готова помочь. Мы предоставляем услуги по проектированию, реализации и поддержке безопасных систем, а также обучающие программы по Rust и криптографии для мобильных платформ.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект