MCrypt

Posted on August 16, 2026 by Ruzen42

Мне всегда не нравились ключи SSH и GPG: они лежат в странных каталогах, а сами инструменты слишком перегружены. У меня было очень мало опыта в криптографии — мой максимум в проектах это GUI на GTK#, которая просто хеширует строку. Но MCrypt - это заметно сложнее. Не буду скрывать, я задействовал Claude Sonnet 4.6 для выбора алгоритмов (Dilithium3 и BLAKE3) и реализации FFI-биндингов под liboqs (Open Quantum Safe) и потратил все дневные токены, я жестко протупил и сломал макрос (#define MCRYPT_SIG_ALG) написав туда “Dilithium3” хотя нужно было OQS_SIG_alg_ml_dsa_65 без кавычек и код не работал потому что в общую для oqs функцию для подписи ложился не макрос, а просто строка “Dilithium3”

#ifndef MCRYPT_OQS_SHIM_H
#define MCRYPT_OQS_SHIM_H

#include <stddef.h>
#include <stdint.h>

#define MCRYPT_SIG_ALG OQS_SIG_alg_ml_dsa_65

size_t mcrypt_sig_public_key_len(void);
size_t mcrypt_sig_secret_key_len(void);
size_t mcrypt_sig_max_signature_len(void);

int mcrypt_sig_keypair(uint8_t *public_key, uint8_t *secret_key);

int mcrypt_sig_sign(uint8_t *signature, size_t *signature_len,
                    const uint8_t *message, size_t message_len,
                    const uint8_t *secret_key);

int mcrypt_sig_verify(const uint8_t *message, size_t message_len,
                      const uint8_t *signature, size_t signature_len,
                      const uint8_t *public_key);

#endif /* MCRYPT_OQS_SHIM_H */

MCrypt официально проверен под

больше я нигде не запускал тулчейн mcrypt, стоит проверить работу программы на винде

Работа с MCrypt

тулчейн mcrypt на момент написания этого поста разбит на две программы, mkey для менеджмента ключей и mcrypt для подписи файлов и проверки подписи, в будущем добавлю функционал щифрования файлов

mkey --list # показывает все ключи, после установки ключей он не создает
mkey --new main # создание дефолтного ключа

mkey -l # ключ готов

Подпись файлов

echo "secret-message: 63784" > message

mcrypt --sign message # получаем message.sig подписанный ключем main
# также можно использовать ключи отличные от main 
# mcrypt --sign message --key name

mcrypt -C message # проверяем ключем main, если файл без изменений проверка подписи пройдет успешно

echo "43" >> message 

mcrypt -C message --key main # выдаст ошибку