Проблема с шифрованием и дешифрованием текста с помощью EVP_des_ofb(), openSSL, C

Мне нужно зашифровать и расшифровать txt-файл с помощью DES-ofb (libcrypto) с использованием библиотеки OpenSSL, ключ и вектор инициализации указаны в одном bin.file(key+iv). Но после расшифровки с помощью EVP_DecryptUpdate() расшифрованный текст и обычный текст совсем не похожи.

Трудности расшифровки

Итак, я прочитал 8-байтовый файл plain.txt и файлы keyandIV.bin. Затем я взял первые 8 байтов из keyandIVbuffer как KEY для DES, а остальные как IV. Итак, у меня есть 8-байтовый ключ и 8-байтовый IV, добавленный «\ 0» в конце обоих (нужен ли мне «\ 0» здесь? Длина ключа должна быть 64 или 56 бит?).

Это мой код для шифрования с помощью DES ofb:

printf("ENCRYPTION:\n");
int howmany = 0, final1;
const EVP_CIPHER *CIPHER_TYPE = EVP_des_ofb();
EVP_CIPHER_CTX *ctx_encrypt = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx_encrypt);

EVP_EncryptInit(ctx_encrypt, CIPHER_TYPE, keybuf1, ivbuf1);
if(!EVP_EncryptUpdate(ctx_encrypt, ciphertextbuf1, &howmany, plaintextbuf1, plainlength1))return -1;
if(!EVP_EncryptUpdate(ctx_encrypt, ciphertextbuf1, &howmany, plaintextbuf1, plainlength1)) return -1;
EVP_EncryptFinal_ex(ctx_encrypt, ciphertextbuf1 + howmany , &final1);
EVP_CIPHER_CTX_cleanup(ctx_encrypt);

Затем я взял зашифрованный буфер и расшифровал его так:

printf("DECRYPTION:\n");
int final2;
EVP_CIPHER_CTX *ctx_decrypt = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx_decrypt);
EVP_DecryptInit(ctx_decrypt, CIPHER_TYPE, keybuf1, ivbuf1);
if(!EVP_DecryptUpdate(ctx_decrypt, decryptedtext, &howmany, ciphertextbuf1, strlen(ciphertextbuf1))) return -1;
if(!EVP_EncryptFinal_ex(ctx_decrypt, decryptedtext + howmany, &final2)) return -1;
EVP_CIPHER_CTX_cleanup(ctx_decrypt);

У меня определенно есть проблемы с пониманием DES. Возможно, я сделал что-то не так, создав ключ и IV из одного файла. Я видел много примеров, но до сих пор не понимаю, что я сделал не так в своей программе.


person grüBer    schedule 30.12.2018    source источник


Ответы (1)


Последовательность расшифровки: EVP_DecryptInit_ex(), EVP_DecryptUpdate() и EVP_DecryptFinal_ex(). Это следует за EVP_EncryptInit_ex(), EVP_EncryptUpdate() и EVP_EncryptFinal_ex(). В вашем коде вы вызываете EVP_EncryptFinal_ex() для расшифровки, поэтому очевидно, что это не сработает. Кроме того, если что-то пошло не так во время операции, код ошибки должен был быть выведен в stderr.

person mnistic    schedule 30.12.2018