Мне нужно зашифровать и расшифровать 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 из одного файла. Я видел много примеров, но до сих пор не понимаю, что я сделал не так в своей программе.