Я использую алгоритм EVP Symmetric Encryption and Decryption
для шифрования и дешифрования файла текста.
Файл шифрования работает, создается новый зашифрованный файл, но когда я пытаюсь расшифровать файл обратно, он всегда вылетает при первом вызове EVP_DecryptFinal_ex
.
Я использую два проекта Visual Studio: один для шифрования и один для дешифрования.
Библиотеки, которые я использую, я предполагал, что они собраны в режиме DEBUG (потому что у них есть файлы .pdb), поэтому мой проект также собирается. (если я выберу режим выпуска, компилятор не сможет больше найти заголовок openssl include).
Это ошибка, которую я получаю:
digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
Я использую версию C ++ 11, вот мой код:
void Cipher::Encrypt(const byte key[KEY_SIZE], const byte iv[BLOCK_SIZE], const secure_string& ptext, secure_string& ctext) {
EVP_CIPHER_CTX_free_ptr ctx(EVP_CIPHER_CTX_new(), ::EVP_CIPHER_CTX_free);
int rc = EVP_EncryptInit_ex(ctx.get(), EVP_aes_256_cbc(), NULL, key, iv);
if (rc != 1)
throw std::runtime_error("EVP_EncryptInit_ex failed");
// Recovered text expands upto BLOCK_SIZE
ctext.resize(ptext.size() + BLOCK_SIZE);
int out_len1 = (int)ctext.size();
rc = EVP_EncryptUpdate(ctx.get(), (byte*)&ctext[0], &out_len1, (const byte*)&ptext[0], (int)ptext.size());
if (rc != 1)
throw std::runtime_error("EVP_EncryptUpdate failed");
int out_len2 = (int)ctext.size() - out_len1;
rc = EVP_EncryptFinal_ex(ctx.get(), (byte*)&ctext[0] + out_len1, &out_len2);
if (rc != 1)
throw std::runtime_error("EVP_EncryptFinal_ex failed");
// Set cipher text size now that we know it
ctext.resize(out_len1 + out_len2);
}
void Cipher::Decrypt(const byte key[KEY_SIZE], const byte iv[BLOCK_SIZE], const secure_string& ctext, secure_string& rtext) {
EVP_CIPHER_CTX_free_ptr ctx(EVP_CIPHER_CTX_new(), ::EVP_CIPHER_CTX_free);
int rc = EVP_DecryptInit_ex(ctx.get(), EVP_aes_256_cbc(), NULL, key, iv);
if (rc != 1)
throw std::runtime_error("EVP_DecryptInit_ex failed");
// Recovered text contracts upto BLOCK_SIZEB
rtext.resize(ctext.size());
int out_len1 = (int)rtext.size();
rc = EVP_DecryptUpdate(ctx.get(), (byte*)&rtext[0], &out_len1, (const byte*)&ctext[0], (int)ctext.size());
if (rc != 1)
throw std::runtime_error("EVP_DecryptUpdate failed");
int out_len2 = (int)rtext.size() - out_len1;
rc = EVP_DecryptFinal_ex(ctx.get(), (byte*)&rtext[0] + out_len1, &out_len2);
if (rc != 1) {
ERR_print_errors_fp(stderr);
throw std::runtime_error("EVP_DecryptFinal_ex failed");
}
// Set recovered text size now that we know it
rtext.resize(out_len1 + out_len2);
}
int main(int argc, char* argv[])
{
// Load the necessary cipher
EVP_add_cipher(EVP_aes_256_cbc());
// create Cipher object
Cipher cipher;
ifstream f("d:/temp.YML");
ofstream out("d:/tempDecrypt.YML");
byte key[KEY_SIZE] = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2};
byte iv[BLOCK_SIZE] = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6};
//cipher.gen_params(key, iv);
secure_string line;
secure_string temp;
while (getline(f, line)) {
cipher.Decrypt(key, iv, line, temp);
std::cout << temp << std::endl;
out << temp;
}
OPENSSL_cleanse(key, KEY_SIZE);
OPENSSL_cleanse(iv, BLOCK_SIZE);
return 0;
}
Я также читал, что это может быть проблема с заполнением, не уверен, так ли это, и что мне делать. Я не так хорош с шифрованием.
Приветствуются любые указания о том, как действовать дальше. Если вам нужна дополнительная информация, дайте мне знать.