Рассмотрим следующий фрагмент кода C++:
#include <iostream>
#include <openssl/aes.h>
#define AES_KEY_LENGTH 32
using namespace std;
int main()
{
AES_KEY encryption_key;
AES_KEY decryption_key;
unsigned char key[AES_KEY_LENGTH] = {'t', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't'};
unsigned char iv[AES_BLOCK_SIZE] = {'t', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't'};
unsigned char iv_enc[AES_BLOCK_SIZE];
unsigned char iv_dec[AES_BLOCK_SIZE];
memcpy(iv_enc, iv, AES_BLOCK_SIZE);
memcpy(iv_dec, iv, AES_BLOCK_SIZE);
AES_set_encrypt_key(key, AES_KEY_LENGTH * 8, &(encryption_key));
AES_set_decrypt_key(key, AES_KEY_LENGTH * 8, &(decryption_key));
char message[] = "Attack at dawn! Attack.";
unsigned char * encryption_output = new unsigned char[32];
encryption_output[31] = 3;
AES_cbc_encrypt((unsigned char *) message, encryption_output, sizeof(message), &encryption_key, iv_enc, AES_ENCRYPT);
unsigned char * decryption_output = new unsigned char[32];
AES_cbc_encrypt(encryption_output, decryption_output, 32, &decryption_key, iv_dec, AES_DECRYPT);
}
Здесь я шифрую, а затем расшифровываю сообщение с помощью библиотеки openssl aes. Что меня беспокоит, так это длина файла encoding_output. Насколько я понимаю, поскольку AES шифрует блоками размером AES_BLOCK_SIZE (он же 16 байт), количество выходных байтов должно быть равно размеру сообщения, округленному до ближайшего кратного AES_BLOCK_SIZE. Это правильно? В частности, что произойдет, если я удлиню сообщение до длины ровно 32 байта? Будет ли это по-прежнему работать, или будут добавлены 16 пустых байтов заполнения, что вызовет ошибку сегментации при попытке записать байты с 32 по 47 в шифрование_выход?
EVP_*
функции.AES_*
и друзья иногда сталкиваются с проблемами порядка следования байтов, и они никогда не будут использовать аппаратное обеспечение, такое как AES-NI, потому что это чисто программная реализация. - person jww   schedule 06.07.2015AES_encrypt
и друзей. Это программная реализация, поэтому вы не получите аппаратной поддержки, такой как AES-NI. Вы должны использоватьEVP_*
функции. См. симметричное шифрование и дешифрование EVP на вики OpenSSL. На самом деле вам, вероятно, следует использовать шифрование с проверкой подлинности, поскольку оно обеспечивает как конфиденциальность, так и подлинность. См. Шифрование и дешифрование с проверкой подлинности EVP на вики OpenSSL. - person jww   schedule 13.08.2016