C EVP_上缺少8字节
这是我的第一个问题,如果我做错了,请告诉我:) 我的问题是我使用C EVP_上缺少8字节,c,openssl,C,Openssl,这是我的第一个问题,如果我做错了,请告诉我:) 我的问题是我使用 EVP_DecryptInit(&ctx1, EVP_des_ecb(), tmpkey, NULL); EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength); EVP_DecryptFinal(&ctx1, keysigout, &outlf); printf("DECLEN:%i",outlu +
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);
解密二进制文件。文件长248字节,但printf只告诉我EVP解密了240字节。keysigfilelength是248,应该告诉更新需要解密248字节
我不明白为什么这不起作用,如果你能启发我,我会很高兴的
编辑:
我只是用命令手动加密了一个文件
openssl enc -e -des-ecb -in test.txt -out test.bin -K 00a82b209cbeaf00
它增加了8个字节:O。我仍然不知道它们来自哪里,但我不认为我的程序中的一般错误是由这个引起的
整个问题的背景是我所在大学的一门信息安全课程。我们用不同的算法完成了类似的任务,但即使是成功完成了程序的人也无法找出我程序中的问题所在
可以为您发布我的整个程序吗?因为块密码只想处理块大小的倍数的输入,所以通常会对输入进行填充以满足此要求。 许多程序(包括
openssl enc
的默认设置是使用
如果明文不是8字节的倍数,则添加填充字节。如果明文已经是8字节的倍数,则添加8字节的填充。因此,加密数据比明文长是完全正常的。我希望可以回答我自己的问题
EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength);
EVP_DecryptFinal(&ctx1, keysigout + outlu, &outlf);
问题是缺少outlu,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;
}
只是为了确保,这不像是在Windows上以文本模式打开文件以便删除“\r”?这是文件的hexdump-C。所有工作都是在linuxI中完成的,但最好是确定。这些函数中有没有返回错误?没有,我检查所有返回值。我的纯文本是248字节,他仍然是ad如果明文是248字节,就加上8字节——我的措辞不是很清楚