EVP_DecryptFinal上缺少8个字节

时间:2012-01-06 22:26:49

标签: 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 + outlf);

解密二进制文件。该文件长248字节,但printf只告诉我EVP解密240字节。 keysigfilelength是248,应该告诉更新需要解密248个字节。

我不明白为什么这不起作用,如果你可以启发我会很高兴。

编辑: 我只是使用命令

手动加密文件
openssl enc -e -des-ecb -in test.txt -out test.bin -K 00a82b209cbeaf00

它增长了8个字节:O。我仍然不知道他们来自哪里,但我不认为我的程序中的一般错误是由此引起的。

整个问题的背景是我大学的信息安全课程。我们使用不同的算法得到了类似的任务,但即使是成功完成程序的人也无法弄清楚程序中的问题所在。

可以为您发布我的整个程序吗?

2 个答案:

答案 0 :(得分:2)

我希望能回答我自己的问题。

EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength);
EVP_DecryptFinal(&ctx1, keysigout + outlu, &outlf);

问题是缺少了outlu,DecryptFinal试图再次解密整个块。当我添加outlu时,我在outlf中获得了7个字节,并且它有效。 为了将来参考,我在下面添加整个功能。 它希望密钥和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;
}

答案 1 :(得分:0)

因为分组密码只是想要处理其块大小的倍数的输入,所以通常填充输入以满足此要求。 许多程序(包括openssl enc)的默认设置是使用PKCS #5 padding

如果明文不是8字节的倍数,则添加填充字节以使其成为。如果它已经是8个字节的倍数,则添加8个字节的填充。因此,加密数据比明文更长是完全正常的。