首页 文章

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

提问于
浏览
5

我正在尝试使用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章)

我可以成功加密/解密 .

我的情景如下:

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

但我有一些问题:

如何分配加密缓冲区大小:char * out =(char *)malloc(inLength EVP_MAX_BLOCK_LENGTH);这够了吗?我承认即使我有一些概念,我也没有详细介绍加密逻辑 . 如果有人能给我一些加密大小逻辑的大小,我真的很感激 . 像base64数据与数据的比例是4:3 . 它有33%的开销 . 但对于加密,我找不到这种信息 . 如何分配解密的缓冲区大小:b64decodeLen =解码b64加密文本 . 它应该是原始的二进制加密数据长度 . char * out =(char *)malloc(b64decodeLen 1);根据上面的malloc加密缓冲区大小 . 我认为纯文本大小将小于二进制加密数据长度 . 这是正确的吗?如有必要,可以多次调用EVP_EncryptUpdate . 什么时候打多次?在哪种情况下我们需要多次调用? https://stackoverflow.com/questions/29016193/block-cipher-in-openssl-how-to-correct-crypt-and-decrypt-in-c

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 回答

  • 4
    • 填充和加密数据后,密文的大小为 plaintext_size + (block_size - plaintext_size % block_size) . 所以你的缓冲区应该足够了 . 在这里查看更多:https://en.wikipedia.org/wiki/Padding_(cryptography)

    • 你已经自己回答了 - base64的比例(enc / dec)是4:3 . 可以在此处找到示例代码和所有解释:https://en.wikipedia.org/wiki/Base64

    • 例如,如果您希望明文在内存中保留(以保护内存不受内存处理),则可以进行多次更新 . 如果情况并非如此 - 请使用单一更新 .

相关问题