加密/解密输出缓冲区大小以及何时多次调用EVP_EncryptUpdate

时间:2016-03-03 09:27:21

标签: openssl

我正在尝试使用openssl来使用AES加密/解密消息。 经过以下研究后: https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption http://www.itc.edu.kh/bib/ebook/storage/Network%20Security%20with%20OpenSSL.pdf(第6章)

我可以成功加密/解密。

我的情景如下:

  
      
  1. 加密:输入纯文本=>使用aes加密256 cbc =>返回带有base64编码的结果
  2.   
  3. 解密:输入加密的base64编码的字符串=> decode base64 =>使用aes解密256 cbc =>返回解密的纯文本
  4.   

但我有一些问题:

  
      
  1. 如何分配加密缓冲区大小:char * out =(char *)malloc(inLength + EVP_MAX_BLOCK_LENGTH);这够了吗?我承认   虽然我没有详细介绍加密逻辑   我有一些概念。如果有人能给我一个大小的暗示   加密大小的逻辑,我真的很感激。像base64数据一样   数据比例为4:3。它有33%的开销。但对于加密,我没有   找到这种信息。

  2.   
  3. 如何分配解密的缓冲区大小:b64decodeLen =解码b64加密文本。它应该是原始的二进制加密   数据长度。 char * out =(char *)malloc(b64decodeLen + 1);
      根据上面的malloc加密缓冲区大小。我觉得   纯文本大小将小于二进制加密数据长度。   这是对的吗?

  4.   
  5. 如有必要,可以多次调用EVP_EncryptUpdate。什么时候打多次?在哪种情况下我们需要多次调用?   https://stackoverflow.com/questions/29016193/block-cipher-in-openssl-how-to-correct-crypt-and-decrypt-in-c

  6.   
while(1){
    EVP_EncryptUpdate(ctx, ciphertext + outlen_tot, &outlen, (unsigned   char*)msg + outlen_tot, block_size);
    outlen_tot += outlen;
    if( msg_len - outlen_tot < block_size ){
        break;
    }
}
  

在此示例中,它为block_size加密。如果我把输入   字符串长度,然后我甚至不需要多次调用   大信息?

EVP_EncryptUpdate(ctx, out, &out_len, inString, strlen(inString));

非常感谢。

1 个答案:

答案 0 :(得分:4)

  1. 在填充和加密数据之后,密文的大小为plaintext_size + (block_size - plaintext_size % block_size)。所以你的缓冲区应该足够了。点击此处:https://en.wikipedia.org/wiki/Padding_(cryptography)
  2. 你自己已经回答了 - base64的比例(enc / dec)为4:3。可以在此处找到示例代码和所有解释:https://en.wikipedia.org/wiki/Base64
  3. 如果您因为某些技术原因(多个数据包,大文件)在一次运行中无法通过整个纯文本,则会执行多次更新。或者你不希望你的明文留在内存中(以保护它免受内存处理器的影响)。如果情况并非如此 - 请使用单一更新。