部分的なファイルのアップロードと暗号化の場合、大きなファイル (例: 100MB) からチャンク (例: 10MB) を読み取り、チャンクを AES256 で暗号化し、チャンクをサーバーにアップロードします。サーバー上で、チャンクは 1 つの大きなファイルに結合されます (完全な暗号化ファイルを表す必要があります)。
チャンクを取り出してサーバーに送信する前に、ファイルの完全な暗号化 (例: 100MB!) を回避したい (CPU オーバーヘッド。最初にファイル全体をコピーし、ファイル全体に対して AES256 を実行する必要があるため) )。
以下を試してみました (16MB ファイルの例 = 2 チャンク = 1*10MB + 1*6MB)
最初のチャンクは ~10MB で、チャンクサイズが 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() を呼び出しません (これが問題なのでしょうか?)。
2 番目のチャンクは ~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);
サーバー上で、2 つのファイル部分が結合されます。その後、暗号化されていないファイルと同じサイズのファイルを「正常に」復号化できます。しかし、オフセット ~10MB では、一部のバイトが異なります (16 バイト! = AES_BLOCK_SIZE
)
何か案が?それはパディングでしょうか?それって最後だけじゃないの?EVP_EncryptFinal_ex
ファイル全体を通過しないと動作が異なりますEVP_EncryptUpdate
か?
暗号化された部分ファイル チャンクを送信し、それらをサーバーに結合して適切な暗号化ファイルを取得するにはどうすればよいですか?
ありがとう!