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

Openssl 加密/解密输出缓冲区大小以及何时多次调用EVP_EncryptUpdate,openssl,Openssl,我正在尝试使用openssl使用AES加密/解密消息。 经过以下研究: (第6章) 我可以成功地加密/解密 我的设想是: 加密:输入纯文本=>Encrypt with aes 256 cbc=>在encode with base64中返回结果 解密:输入加密的base64编码字符串=>解码base64=>使用aes 256 cbc解密=>返回解密的纯文本 但我有一些问题: 如何分配加密的缓冲区大小:char*out=(char*)malloc(inLength+EVP\u MAX\u BLOCK

我正在尝试使用openssl使用AES加密/解密消息。 经过以下研究: (第6章)

我可以成功地加密/解密

我的设想是:

  • 加密:输入纯文本=>Encrypt with aes 256 cbc=>在encode with base64中返回结果
  • 解密:输入加密的base64编码字符串=>解码base64=>使用aes 256 cbc解密=>返回解密的纯文本
  • 但我有一些问题:

  • 如何分配加密的缓冲区大小:char*out=(char*)malloc(inLength+EVP\u MAX\u BLOCK\u LENGTH);这够了吗?我承认 我没有详细介绍加密逻辑,即使 我有一些概念。如果有人能给我一个提示的大小 加密大小逻辑,我真的很感激。将base64数据 数据比率为4:3。它有33%的开销。但对于加密,我不知道 找到这类信息

  • 如何分配解密的缓冲区大小:b64decodeLen=解码b64加密文本。它应该对原始二进制文件进行加密 数据长度。char*out=(char*)malloc(b64decodeLen+1)
    根据上述malloc的加密缓冲区大小。我认为 纯文本大小将小于二进制加密的数据长度。 是这样吗

  • 如有必要,可以多次调用EVP_EncryptUpdate。什么时候打多次电话?在这种情况下,我们需要打多次电话?

  • 非常感谢

  • 填充和加密数据后,密文的大小为
    明文大小+(块大小-明文大小%block大小)
    。所以你的缓冲应该足够了。请参阅此处的更多信息:
  • 您已经自己回答过了-base64的比率(enc/dec)为4:3。示例代码和所有说明可在此处找到:
  • 例如,如果由于某些技术原因(多个数据包、大文件),无法在一次运行中传递整个明文,则需要执行多个更新。或者你不希望你的明文在内存中逗留(以保护它不被内存碎片破坏)。如果不适合您,请使用单一更新
  • 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;
        }
    }
    
    EVP_EncryptUpdate(ctx, out, &out_len, inString, strlen(inString));