1

我需要使用 OpenSSL 库使用 DES-ofb (libcrypto) 加密和解密 txt 文件,密钥和初始化向量在一个 bin.file(key+iv) 中给出。但是通过 EVP_DecryptUpdate() 解密后,解密后的文本和纯文本完全不相似。

解密难度

所以我读了plain.txt 8 个字节和一个'keyandIV.bin' 文件。比我从 keyandIVbuffer 中取出前 8 个字节作为 DES 的 KEY,其余的作为 IV。所以我有 8 个字节的密钥和 8 个字节的 IV,在两者的末尾添加了 '\0'(我需要 '\0' 吗?密钥长度必须是 64 位还是 56 位?)。

这是我使用 DES ofb 进行 ercryption 的代码:

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 做错了什么。我已经看过很多例子,但我仍然不明白我在程序中做错了什么。

4

1 回答 1

1

解密序列为EVP_DecryptInit_ex()EVP_DecryptUpdate()EVP_DecryptFinal_ex()。这遵循EVP_EncryptInit_ex()EVP_EncryptUpdate()EVP_EncryptFinal_ex()在您调用EVP_EncryptFinal_ex()解密的代码中,显然这行不通。此外,如果在操作过程中出现问题,则应该将错误代码打印到 stderr。

于 2018-12-30T14:12:50.577 回答