这是我的第一个问题所以请告诉我,如果我做错了什么:).
我的问题是我用的
EVP_DecryptInit(&ctx1, EVP_des_ecb(), tmpkey, NULL);
EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength);
EVP_DecryptFinal(&ctx1, keysigout, &outlf);
printf("DECLEN:%i",outlu + outlf);
Run Code Online (Sandbox Code Playgroud)
解密二进制文件.该文件长248字节,但printf只告诉我EVP解密240字节.keysigfilelength是248,应该告诉更新需要解密248个字节.
我不明白为什么这不起作用,如果你能开导我会很高兴.
编辑:我刚用命令手动加密文件
openssl enc -e -des-ecb -in test.txt -out test.bin -K 00a82b209cbeaf00
Run Code Online (Sandbox Code Playgroud)
它增长了8个字节:O.我仍然不知道他们来自哪里,但我不认为我的程序中的一般错误是由此引起的.
整个问题的背景是我大学的信息安全课程.我们使用不同的算法得到了类似的任务,但即使是成功完成程序的人也无法弄清楚程序中的问题所在.
可以为您发布我的整个程序吗?
我希望能回答我自己的问题。
EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength);
EVP_DecryptFinal(&ctx1, keysigout + outlu, &outlf);
Run Code Online (Sandbox Code Playgroud)
问题是缺少输出,DecryptFinal 尝试再次解密整个块。当我添加 outlu 时,我在 outlf 中得到了 7 个字节,并且它起作用了。为了将来的参考,我添加了下面的整个函数。它期望 key 和 iv 是一个数据块。
int decrypt(const EVP_CIPHER *cipher,unsigned char *key, unsigned char *encryptedData, int encryptedLength,unsigned int * length, unsigned char ** decryptedData)
{
int decryptedLength = 0, lastDecryptLength = 0, ret;
unsigned char * iv = NULL;
EVP_CIPHER_CTX *cryptCtx = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(cryptCtx);
*decryptedData = malloc (encryptedLength * sizeof(char));
if(cipher->iv_len != 0) iv = key + cipher->key_len;
EVP_DecryptInit_ex(cryptCtx, cipher, NULL, key, iv);
EVP_DecryptUpdate(cryptCtx, *decryptedData, &decryptedLength, encryptedData, encryptedLength);
ret = EVP_DecryptFinal_ex(cryptCtx, *decryptedData + decryptedLength, &lastDecryptLength);
*length = decryptedLength + lastDecryptLength;
EVP_CIPHER_CTX_free(cryptCtx);
EVP_cleanup();
return ret;
}
Run Code Online (Sandbox Code Playgroud)