Мне нужно зашифровать и расшифровать txt-файл с помощью DES-ofb (libcrypto) с использованием библиотеки OpenSSL, ключ и вектор инициализации которого приведены в одном bin.file (ключ + iv).Но после дешифрования с помощью EVP_DecryptUpdate () расшифрованный текст и обычный текст не похожи вообще.
![Decryption Difficulties](https://i.stack.imgur.com/nkq9A.png)
Итак, я прочитал 8 байтов plain.txt и файлы 'keyandIV.bin'.Тогда я взял первые 8 байтов из keyandIVbuffer как KEY для DES, а остальные как IV.Таким образом, у меня есть 8-байтовый ключ и 8-байтовый IV, добавленные «\ 0» в конце обоих (нужен ли здесь «\ 0»? Длина ключа должна быть 64 или 56 битов?).
Этомой код для шифрования с помощью DES:
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 из одного файла. Я видел множество примеров, но я все еще не понимаю, что я сделал неправильно в моей программе.