OpenSSL расшифрованная длина текста

Я использую эту простую функцию для дешифрования зашифрованной строки AES

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
{
int p_len = *len, f_len = 0;
unsigned char *plaintext = (unsigned char*)malloc(p_len + 128);
memset(plaintext,0,p_len);
EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL);
EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len);

*len = p_len + f_len;
return plaintext;
}

Проблема в том, что len возвращает значение, которое не соответствует всей декодированной строке. В чем может быть проблема ?

0

Решение

Когда вы говорите «строка», я предполагаю, что вы имеете в виду текстовую строку с нулевым символом в конце. Процесс шифрования зависит от размера блока шифрования и частого заполнения. Что на самом деле кодируется и декодируется, зависит от приложения … это все двоичные данные для шифра. Если ваша текстовая строка меньше, чем то, что возвращается из процесса дешифрования, ваше приложение должно определить полезную часть. Так, например, если вы ЗНАЕТЕ, что ваша строка внутри результатов заканчивается на ноль, вы можете получить длину, выполнив простую строку. Конечно, это рискованно, если вы не можете гарантировать ввод … возможно, лучше искать результаты с нулем до декодированной длины …

2

Другие решения

Если вы используете шифр в ECB, CBC или некоторых других режимах цепочки, вы должны добавить простой текст к длине, кратной длине блока шифра. Вы можете увидеть стандарт PKCS # 5, например. Функции высокого уровня, такие как в OpenSSL, могут прозрачно выполнять заполнение для программиста. Таким образом, зашифрованный текст может быть больше, чем обычный текст, вплоть до дополнительного размера блока шифрования.

1

По вопросам рекламы [email protected]