знаю, что не знаю)
Профи
(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)
Ошибка вылезет в dll-ке, OpenSSL собирал в консоли разработчика x64 (x64 Native Tools Command Prompt for VS 2022), и почему то все время выбивает данную ошибку во время шифрования
Как починить данную проблему?