Как реализовать шифрование RSA в C? - PullRequest
2 голосов
/ 05 августа 2020

Я пытаюсь использовать асимметричное c шифрование в программе C, чтобы зашифровать строки .

Я выбрал go с RSA, но если есть менее сложный, но безопасный способ, скажите мне .

OpenSSL - это одна библиотека, которую я просмотрел и не нашел документации по ее реализации в коде C. (Возможно, мне просто не повезло , я искал много дней)

Не повезло и на YouTube / Google ...

Пожалуйста, укажите мне на подробный источник информации о том, как это сделать ...

Я хорошо понимаю как C, так и фундаментальные концепции RSA, но я не знаю, как это сделать: * Генерировать большие простые числа, необходимые для генерации ключей. Fix e = 65537. Генерировать publi c / закрытые ключи в буквенно-цифровом c формате (на самом деле это числа, не так ли?). Плавно комбинируйте (e, n) в ключе publi c и (d, n) в закрытом ключе, как это делают такие инструменты, как OpenSSL (в виде буквенно-цифровой c строки).

1 Ответ

3 голосов
/ 05 августа 2020

Вот пример того, что вы хотите сделать. Сначала служебная функция для вывода сообщений об ошибках OpenSSL:

void log_ssl_err(const char *mes)
{
    unsigned long err, found;
    char errstr[1000];

    found = 0;
    while ((err = ERR_get_error())) {
        ERR_error_string(err, errstr);
        printf("%s: %s", mes, errstr);
        found = 1;
    }
    if (!found) {
        printf("%s", mes);
    }
}

Генерация ключа с заданной степенью:

RSA *rsa;
BIGNUM *e;
uint32_t exponent_bin, exponent_num;

exponent_num = 65537;
exponent_bin = htonl(exponent);
e = BN_bin2bn((const unsigned char *)&exponent_bin, 4, NULL);
if (e == NULL) {
    log_ssl_err("BN_bin2bn failed for e");
    exit(1);
}

if ((rsa = RSA_new()) == NULL) {
    log_ssl_err("RSA_new failed");
    BN_free(e);
    exit(1);
}
if (!RSA_generate_key_ex(rsa, 2048, e, NULL)) {
    log_ssl_err("couldn't generate rsa key");
    BN_free(e);
    exit(1);
}

Шифрование и дешифрование:

unsigned char plaintext[] = "this is the plaintext";
unsigned char *ciphertext, *decrypted;
int cipher_len, decrypted_len;

ciphertext = malloc(RSA_size(rsa));
if ((cipher_len = RSA_public_encrypt(strlen(plaintext), plaintext, ciphertext, 
                                    rsa, RSA_PKCS1_OAEP_PADDING)) == -1) {
    log_ssl_err("RSA_public_encrypt failed");
    exit(1);
}

decrypted = malloc(RSA_size(rsa));
if ((decrypted_len = RSA_private_decrypt(cipher_len, ciphertext, decrypted, 
                                         rsa, RSA_PKCS1_OAEP_PADDING)) == -1) {
    log_ssl_err("RSA_private_decrypt failed");
    return 0;
}

документация по OpenSSL может быть трудной для навигации, но необходимую информацию можно найти на страницах руководства. Если вы запустите man 3 rsa, вы увидите список всех функций, связанных с RSA. Оттуда вы можете посмотреть справочную страницу для каждой функции.

...