Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ошибка шифрования AES OpenSSL C++

Родион Перкин Ученик (90), открыт 3 недели назад
 Вызвано исключение по адресу 0x00007FF99D5533A0 (libcrypto-3-x64.dll) в console.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000005516700000. 
Перед шифрованием устанавливал ключ (AES_set_encrypt_key), для шифровки использовал AES_cbc_encrypt

Ошибка вылезет в dll-ке, OpenSSL собирал в консоли разработчика x64 (x64 Native Tools Command Prompt for VS 2022), и почему то все время выбивает данную ошибку во время шифрования

Как починить данную проблему?
2 ответа
знаю, что не знаю) Профи (578) 3 недели назад
Ошибка, о которой Вы упоминаете, связана с нарушением прав доступа к памяти. Это может быть вызвано несколькими причинами. Вот несколько шагов, которые стоит проверить и попробовать:

Инициализация ключа иIV:
Убедитесь, что Вы правильно инициализируете ключ и вектор инициализации (IV) перед использованием функции шифрования. IV должен быть инициализирован нулями или любыми другими значениями.

Пример:
unsigned char key[16]; // 128 bit ключ
unsigned char iv[AES_BLOCK_SIZE]; // IV должен быть размером блока AES
memset(iv, 0, AES_BLOCK_SIZE); // Инициализация IV нулями


Корректный размер буфера:
Убедитесь, что буфера, который Вы передаете в функцию AES_cbc_encrypt, достаточно для хранения выходных данных. Например, если Вы шифруете блоки, размер выходного буфера должен быть кратен размеру блока AES (16 байт).

Проверка указателей:
Убедитесь, что указатели на входные и выходные данные записаны правильно. Если один из указателей указывает на память, которая не была выделена или освобождена, это приведет к ошибкам.

Обработка данных:
Если Вы шифруете данные, убедитесь, что длина Ваших данных также кратна размеру блока. Если не так, Вы можете использовать режим PKCS#7 для дополнения данных.

Обработка исключений:
Используйте отладчик для анализа. Вы можете установить точку останова перед вызовом шифрования и проанализировать состояние переменных.

Пример использования API OpenSSL для AES CBC:
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <iostream>
#include <cstring>

void encrypt(unsigned char *plaintext, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) {
AES_KEY enc_key;
AES_set_encrypt_key(key, 128, &enc_key);
AES_cbc_encrypt(plaintext, ciphertext, strlen((char *)plaintext)+1, &enc_key, iv, AES_ENCRYPT);
}

int main() {
unsigned char key[16]; // 128 bit ключ
unsigned char iv[AES_BLOCK_SIZE]; // IV
unsigned char plaintext[] = "Hello, World!"; // Данные для шифрования
unsigned char ciphertext[128]; // Буфер для шифрования

// Генерация ключа и IV
RAND_bytes(key, sizeof(key));
memset(iv, 0, sizeof(iv)); // Инициализация IV нулями

encrypt(plaintext, key, iv, ciphertext);

std::cout << "Encrypted data: ";
for (int i = 0; i < sizeof(ciphertext); i++) {
printf("%02x", ciphertext[i]);
}
std::cout << std::endl;

return 0;
}



Если помогло, то прошу отписать в комментарии под ответом.
Также буду благодарен за лайк<3)
Jurijus Zaksas Искусственный Интеллект (445767) 3 недели назад
А нам-то откуда знать? Дебажь свою библиотеку, раз в ней ошибка. У нас нет ни твоей программы, ни этой библиотеки.
Похожие вопросы