2016-03-03 141 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

謝謝你的解釋:) –