我有以下功能解密密文。
但是我有一个问题,我想在没有明文长度的情况下解密数据!我怎么做?好像我发送了一个加密数据,发送带有明文长度的密文是不合适的。
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;
}
提前致谢!! :)
答案 0 :(得分:4)
您实际上并不需要明文长度 - 只需要密文的长度。
EVP可以自动执行和处理PKCS#7填充,并默认执行此操作。 PKCS#7填充的工作原理如下:它确定需要多少个填充字符来阻塞对齐明文以进行加密,然后获取该数字并在明文末尾多次重复(以字节形式)。< / p>
例如,如果我有一个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字节边界对齐,那么我将16字节10
(即十六进制16)添加到明文的末尾。因此,我总是可以假设明文中存在填充,从而无需猜测。 EVP的例程将在解密后检测填充并将其修剪掉,并以正确的长度返回原始明文。
答案 1 :(得分:1)
通常,您会在加密前为明文添加长度指示符作为前缀。这可以与单个字节“最后一个块中的有效字节”一样小。