2016-03-22 7 views
-2

私はCTRブロックチェーニングでAES暗号化用のC++プログラムを作成していますが、私の質問にはどちらの知識も必要ありません。AESのメモリ効率

暗号化して新しい暗号化ファイルに出力するために、どれだけのファイルをバッファする必要があるのでしょうか。私はディスクの読み込みが非常に高価であることを知っているので、私はこれを尋ねます。それは、可能であれば、元のファイル全体を読み込んでバッファリングし、暗号化して新しいファイルに出力する必要があります。しかし、ファイルが1GBの場合、私は暗号化中にメインメモリに1GB全体を予約したくありません。

ですから、最適なバッファサイズは何ですか?たとえば、1MBのファイル全体を処理するために100MBのバッファリングと10回の暗号化の繰り返しを実行します。ありがとう。

+3

「CTRブロックチェーニング」は意味がありません。 – zaph

+0

十分に公正ですが、あなたは私の言いたいことを理解しています。 –

+3

いいえ、私はしません。 CTRはストリーミングモードであるカウンタコードです。 CBCはCypher Block Chainingです。彼らは非常に異なっています。 [操作の暗号モード](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)を参照してください。あなたは暗号化を理解するのに少し時間を費やす必要があります。 – zaph

答えて

2

「ディスクの読み取りはかなり高価です」というメッセージは誰に伝えられていますか?テラバイトのデータを処理していない限り、IOのコストはそれほど重要ではないため、測定に時間がかかるでしょう。 1MBのバッファが必要以上に多くなります。私は、64KBと1MB以上のベンチマーク可能な違いを見つけるのは難しいでしょう。

例外的に、これは輻輳したネットワーク上のNASドライブのような非常に遅いデバイスから多くのデータを読み取っている場合ですが、それでもバッファリングを実装しようとすると偽の最適化であること。その場合、ローカルドライブにデータをコピーし、ローカルストレージからそれを処理します。

C++のバッファは、合理的なデフォルトで入力され、出力されますが、ほとんどのオペレーティングシステムは、読み込み効率を上げるために、読み込み中のデータブロックを取得します。非常に説得力のある理由がない限り、通常の行動に固執してください。カスタムバッファリングコードを書く必要はありません。

+0

私はあなたとバッファサイズを持っていますが、 "ディスクの読み込みはかなり高価です"。私はあなたに言っている。 –

+2

真実ですが、「テラバイトのデータを処理しているのでなければ、IOのコストはそれほど重要ではないため、測定するのは難しいでしょう」それはちょうど当てはまりません、特にディスクがうまくいけば、ディスクです。あなたはそれをメモリスピード、CPUスピード以外のものと比較したいのですか? –

+0

私は言い方をします: "IOコストは固定されており、IOコードにバッファリングを増やして、その効果を制限することになります。"つまり、IO速度は通常は十分すぎるものであり、テラバイト規模以外はほとんど問題になりません。 – tadman

4

Memory mapこのファイルを使用して、システムに正しいバッファサイズがわかるようにします。

通常、ファイルは主に(サーバーとデスクトップシステムで)メインメモリにバッファされます。したがって、アプリケーションのバッファーサイズは比較的小さく保つことができます。 1 MiBは十分であり、1 GiB以上のメインメモリ以上のシステムでは問題にならないでしょう。

メモリをバッファしない組み込みシステムでは、何が起きているのか、メモリを取る必要があるかを把握する必要があります。私は約1-8キロバイトのバッファーを最低限必要と考えています。あなたがそれよりも低くなると、AESの操作にも時間をかけたいと思うかもしれません。

後で最適化できるようにするには、バッファを64バイトの倍数にする必要があります(AESのブロックサイズは16バイト、SHA-2 512のブロックサイズは64バイト)。一般的には、2つの完全な累乗または可能な限り近い累乗を試してください(1つのMiBは2^20バイトです)。

+0

私はそれがどういう意味か分かりません。 –

関連する問題