2016-03-03 140 views
2

我正在尝试使用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)加密/解密输出缓冲区大小和何时多次调用EVP_EncryptUpdate

我可以加密/解密成功。

我的情形是这样的:

  1. 加密:输入加密base64编码串=>解码:输入明文=>使用AES 256 CBC =>返回结果中编码与BASE64
  2. 解密加密BASE64 =>解密使用AES 256 CBC =>返回解密明文

但我有一些问题的:

  1. 如何分配加密的缓冲区大小:字符* OUT =(字符*)malloc的(inLength + EVP_MAX_BLOCK_LENGTH);这够了吗?我承认 ,我没有通过加密逻辑的细节,即使 我有一些概念。如果有人可以给我一个暗示大小为 的加密大小逻辑,我真的很感激。像base64数据到 数据比例是4:3。它有33%的开销。但对于加密,我不会 找到这种信息。

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

  3. 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
  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. 如果您因为某些技术原因(多个数据包,大文件)而无法在一次运行中传递整个明文,则会执行多个更新。或者你不想让你的明文在内存中逗留(为了保护它免受内存分割)。如果情况并非如此 - 请使用单一更新。
+0

谢谢你的解释:) –