我正在尝试使用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编码的字符串=> decode 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));
非常感谢。
答案 0 :(得分:4)
plaintext_size + (block_size - plaintext_size % block_size)
。所以你的缓冲区应该足够了。点击此处:https://en.wikipedia.org/wiki/Padding_(cryptography)