Проблема с помощью шифрования и дешифрования текста с помощью EVP_des_ofb (), openSSL, C - PullRequest
0 голосов
/ 30 декабря 2018

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

Decryption Difficulties

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

1 Ответ

0 голосов
/ 30 декабря 2018

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

...