Я пытаюсь зашифровать строку с помощью библиотеки OpenSSL EVP и впоследствии расшифровать ее с помощью команды openssl из терминала linux.Команда OpenSSL для расшифровки:
openssl enc -aes-256-cbc -base64 -salt -d -md md5 -k <passphrase> -in encrypt.txt -out plain.txt
Код шифрования:
int CAES::encrypt(const char* msg, unsigned char** encrypted_message, const size_t msg_len, const unsigned char *key, unsigned char *iv, const unsigned char* salt)
{
//this buffer will hold the salt and the cipher
const int buffer_len ( CAES::salt_info_size + std::max((int)(msg_len * 2), EVP_MAX_KEY_LENGTH) );
unsigned char* buffer = new unsigned char[buffer_len];
//this will be a pointer to the cipher only
unsigned char* cipher = CAES::salt_info_size + buffer;
size_t bytes_encrypted(0);
bool encryption_error(true);
EVP_CIPHER_CTX *cipher_ctx( create_cipher_ctx(encryption, key, iv) );
(void) EVP_CIPHER_CTX_set_key_length(cipher_ctx, EVP_MAX_KEY_LENGTH);
size_t cipher_len(0);
int temp_len(0);
if( EVP_EncryptUpdate(cipher_ctx, cipher, &temp_len, (unsigned char *)msg, strlen(msg)) )
{
cipher_len = temp_len;
if( EVP_EncryptFinal_ex(cipher_ctx, cipher + temp_len, &temp_len) )
{
cipher_len += temp_len;
}
cipher[cipher_len] = '\0';
encryption_error = false;
bytes_encrypted = cipher_len;
}
memcpy(buffer + 0 , CAES::salt_tag, CAES::salt_tag_size);
memcpy(buffer + CAES::salt_tag_size, salt, CAES::salt_size);
memcpy(*encrypted_message, buffer, CAES::salt_info_size + bytes_encrypted);
EVP_CIPHER_CTX_free(cipher_ctx);
delete[] buffer;
return CAES::salt_info_size + bytes_encrypted;
}
Код для кодирования зашифрованной строки сверху в base64:
int CBase64::encode(const unsigned char* msg, const size_t msg_len, char** b64_msg) {
size_t bytes_encoded = 0;
bytes_encoded = EVP_EncodeBlock((unsigned char *) *b64_msg, msg, msg_len);
return bytes_encoded;
}
Вывод ключа и IV
void CAES::init_key_iv(const std::string& pass, const unsigned char* salt, unsigned char* key, unsigned char* iv )
{
const unsigned char * pass_key = reinterpret_cast<const unsigned char*>( pass.c_str() );
const size_t pass_key_len ( pass.size() );
EVP_BytesToKey(CAES::cipher_type, CAES::msg_digest_type, salt, pass_key, pass_key_len, 1, key, iv);
}
Ниже приведены ключевые размеры и вывод соли:
unsigned char salt[8] = {};
unsigned char key[32] = {};
unsigned char iv_enc[16] = {};
RAND_bytes(salt, 8);
Случай 1:
const char* password = "@N";
const char* msg = "neo4j";
При попытке расшифровать я получаю следующее:
bad decrypt
140589946300064:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539:
Случай 2:
const char* password = "eemnsis";
const char* msg = "This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.This is long message, repeating 10 times.";
При попытке расшифровки я получаю следующее:
error reading input file