1

部分的なファイルのアップロードと暗号化の場合、大きなファイル (例: 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か?

暗号化された部分ファイル チャンクを送信し、それらをサーバーに結合して適切な暗号化ファイルを取得するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

1

2 番目のチャンクに間違った初期化ベクトルを使用しています。CBCでは、iv後続の暗号化の は、前の暗号文の最後の 16 バイトである必要があります。このように、暗号化された部分を連結するだけで、全体が暗号化されます。

于 2012-09-04T19:55:08.003 に答える
0

通常、これにはカウンター モード暗号化を使用しますが、OpenSSL では使用できないようです。OpenSSL ブロック暗号では、ファイルの途中で暗号化/復号化を開始することはできません。CBC の場合、以前の暗号化されたブロックを知り、それを IV として挿入する必要があります。クライアントでそれらを順次暗号化すると、サーバーで比較的簡単に復号化できます。

もちろん、各ブロックを個別に暗号化してから、復号化されたブロックを連結することもできます。

于 2012-09-04T21:24:43.613 に答える