使用 EVP_des_ofb()、openSSL、C 对文本进行加密和解密的问题

Problem by Encryption & Decryption of text with EVP_des_ofb(), openSSL , C

我需要使用 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 加密的代码:

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 的理解肯定有问题。也许我通过从一个 file.I 中创建密钥和 IV 做错了一些事情,但我仍然不明白我在我的程序中做错了什么。

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