2012-09-04 88 views
1

對於部分文件上傳和加密,我想從大文件(例如:100MB)中讀取塊(例如:10MB),使用AES256對塊進行加密並上傳大塊到服務器。 在服務器上,塊組合在一起成爲一個大文件(然後應該代表完整的加密文件)。openssl AES256文件部分的多重加密(稍後加入)

在取出塊並將它們發送到服務器之前,我想避免對文件進行完全加密(例如:100MB!)(CPU開銷,因爲我首先需要複製整個文件並執行AES256在整個文件中)。

我嘗試以下(例如用於16MB文件= 2個結塊= 1 * 10MB + 1 * 6MB)

第一組塊是〜10MB,確保則CHUNKSIZE是16(AES_BLOCK_SIZE)的倍數

EVP_CIPHER_CTX e_ctx; 
EVP_CIPHER_CTX_init(&e_ctx); 
EVP_EncryptInit_ex(&e_ctx, EVP_aes_256_cbc(), NULL, key, iv); 
EVP_EncryptUpdate(&e_ctx, enc_data, &outlen, unenc_data, chunksize_to_load_from_file_unencrypted); 

在第一塊期間,我不會調用EVP_EncryptFinal_ex(),因爲加密還沒有結束(可能是這個問題?)。

第二塊是〜6MB,有我對數據進行加密,從&outlen偏移的上面休息

EVP_CIPHER_CTX e_ctx; 
EVP_CIPHER_CTX_init(&e_ctx); 
EVP_EncryptInit_ex(&e_ctx, EVP_aes_256_cbc(), NULL, key, iv); 
EVP_EncryptUpdate(&e_ctx, enc_data, &outlen, unenc_data, chunksize_to_load_from_file_unencrypted); 
EVP_EncryptFinal_ex(&e_ctx, enc_data+outlen, &final_length); 

在這兩個文件的部分得到的加入了服務器。 然後,我可以解密文件「成功」,相同大小的未加密文件。但是在偏移~10MB,一些字節是不同的(16字節!= AES_BLOCK_SIZE

任何想法?這可能是填充?這不僅是最後的? EVP_EncryptFinal_ex不通過EVP_EncryptUpdate通過整個文件時行爲不同?

我怎樣才能傳輸加密的部分文件塊,並加入他們在服務器上以獲得一個適當的加密文件?

謝謝!

+0

當前日期和年齡是100MB?這可能會在一秒鐘內加密! –

+0

100MB是一個例子,也可能高達<= 2GB。我正在編寫一個後臺同步守護進程,其中AES256加密可能需要一些重要的CPU ticks,用戶不會喜歡...... –

回答

1

對於第二塊,您正在使用錯誤的初始化向量。對於CBC,後續加密的iv應該是先前密文的最後16個字節。這樣,只是連接加密部分就可以對整體進行加密。

+0

將對此進行測試。用EVP_BytesToKey創建我的IV,也許IV獲得的隨機?? –

+0

生成初始'iv'的任何方法都可以工作(儘管是安全的,它應該隨機生成)。但是'iv'只能用於第一塊。後續塊的'iv'就是前一個塊的密文。查看圖片的CBC鏈接。 –

+0

完美的作品!謝謝 –

0

通常情況下,您會使用計數器模式加密,但對於OpenSSL來說這似乎不可用。使用OpenSSL塊密碼,您不能在文件中間開始加密/解密。對於CBC,您需要知道以前的加密塊並將其作爲IV插入。如果您在客戶端按順序加密它們,則可以在服務器上相對輕鬆地解密它們。

當然,您也可以分別加密每個塊,然後將解密塊拼接在一起。