У меня есть буфер, в который я добавляю обычный текст. Я хочу использовать шифрование openssl AES для шифрования текста, затем расшифровать его и распечатать обратно на экране.
Код работает без ошибок.
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string>
#include <openssl/aes.h>
using namespace std;
void main()
{
// Buffers
unsigned char inbuffer[1024];
unsigned char encryptedbuffer[1024];
unsigned char outbuffer[1024];
// CODE FOR ENCRYPTION
//--------------------
unsigned char oneKey[] = "abc";
AES_KEY key;
AES_set_encrypt_key(oneKey,128,&key);
AES_set_decrypt_key(oneKey,128,&key);
//--------------------
string straa("hello world\n");
memcpy((char*)inbuffer,straa.c_str(),13);
printf("%s",inbuffer);
//this prints out fine
AES_encrypt(inbuffer,encryptedbuffer,&key);
//printf("%s",encryptedbuffer);
//this is expected to pring out rubbish, so is commented
AES_decrypt(encryptedbuffer,outbuffer,&key);
printf("%s",outbuffer);
//this is not pringint "hello world"
getchar();
}
Я знаю о том факте, что после помещения в новые буферы "encryptedbuffer" и "outbuffer" они не заканчиваются нулем "\0" , но даже в этом случае, распечатывая необработанные данные, я получаю мусор только после расшифровка. В конце расшифровки я предполагаю, что \0 также должен быть расшифрован, и поэтому printf должен печатать правильно.
Кто-нибудь знает, как заставить работать расшифровку?
Также есть идеи, как печатать буферы с помощью библиотек C++, может быть, cout, а не printf?
oneKey
не менее 16 байт (сейчас это только 3 байта). Дополнительные байты будут игнорироваться. (2) Сделайтеstraa
ровно 16 байт (сейчас только 12 или 13 байт). (3) Сбросьте ключ между вызовамиAES_encrypt
иAES_decrypt
. (4) Рассмотрите возможность переключения на функцииEVP_*
, которые проще для новичка. См., например, симметричное шифрование и дешифрование EVP на вики OpenSSL. ИспользуйтеEVP_aes_128_ecb()
в качестве шифра для эквивалентной программы. - person jww   schedule 30.01.2014AES_encrypt
и друзей. Вы должны использоватьEVP_*
функции. См. симметричное шифрование и дешифрование EVP на вики OpenSSL. На самом деле вам, вероятно, следует использовать шифрование с проверкой подлинности, поскольку оно обеспечивает как конфиденциальность, так и подлинность. См. Шифрование и дешифрование с проверкой подлинности EVP на вики OpenSSL. - person jww   schedule 15.05.2015