0

我有以下解密密文的函数。

但是我有一个问题,我想在没有明文长度的情况下解密数据!我怎么做?就像我发送加密数据一样,发送具有纯文本长度的密文是不合适的。

int main()
{
/*some code*/
char input[] = "123456789abcdef";
int olen, len;
len = strlen(input)+1;

plaintext = (char *)aes_decrypt(&de, ciphertext, &len);
/*some code*/
}

解密方法

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
    {
      /* plaintext will always be equal to or lesser than length of ciphertext*/
      int p_len = *len, f_len = 0;
      unsigned char *plaintext = (unsigned char *)malloc(p_len);

      if(!EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL)){
        printf("ERROR in EVP_DecryptInit_ex \n");
        return NULL;
      }

      if(!EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len)){
        printf("ERROR in EVP_DecryptUpdate\n");
        return NULL;
      }

      if(!EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len)){
        printf("ERROR in EVP_DecryptFinal_ex\n");
        return NULL;
      }

      *len = p_len + f_len;
      return plaintext;
    }

提前致谢!!:)

4

2 回答 2

4

您实际上并不需要明文长度 - 只需要密文的长度。

EVP 可以“自动”执行和处理 PKCS #7 填充,并且默认情况下会执行此操作。PKCS #7 填充的工作方式如下:它确定需要多少个填充字符来块对齐明文以进行加密,然后获取该数字并在明文末尾重复该数字多次(以字节形式)。

例如,如果我有一个 14 字节的十六进制形式的明文块

61 74 74 61 63 6b 20 61 74 20 64 61 77 6e

我需要将它填充到 16 个字节以进行加密,我将02在末尾附加两次以获得

61 74 74 61 63 6b 20 61 74 20 64 61 77 6e 02 02

如果我的明文已经与 16 字节边界对齐,那么我10在明文的末尾添加 16 个字节(即 16 个十六进制)。因此,我总是可以假设明文中存在填充,无需猜测。EVP 的例程将在解密后检测填充并将其修剪掉,返回具有正确长度的原始明文。

于 2012-07-26T15:54:26.217 回答
1

通常,您会在加密之前为明文添加长度指示符。这可以小到单个字节“最后一个块中的有效字节”。

于 2012-07-26T16:07:33.880 回答