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

rod*_*_la 6 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 ( Chapater 6)

我可以成功加密/解密.

我的情景如下:

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

但我有一些问题:

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

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

  3. 如有必要,可以多次调用EVP_EncryptUpdate.什么时候打多次?在哪种情况下我们需要多次调用? /sf/ask/2031133541/

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,它为block_size加密.如果我把输入字符串长度,那么即使每个大的消息,我也不需要多次调用?

EVP_EncryptUpdate(ctx, out, &out_len, inString, strlen(inString));
Run Code Online (Sandbox Code Playgroud)

非常感谢.

Leś*_*ajs 5

  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. 例如,如果由于某些技术原因(多个数据包、大文件)而无法在一次运行中传递整个纯文本,则您需要进行多次更新。或者您不希望您的明文留在内存中(以保护它免受内存抓取)。如果您不是这种情况 - 使用单一更新。