3

あるプログラミング言語を使用して文字列を暗号化し、別のプログラミング言語を使用してその文字列を復号化する場合は、互換性を確保するために、暗号化を行う前にいくつかの変換を行うのが最善であることを読みました。文字列自体ではなく、文字列のバイト配列を暗号化することがベストプラクティスであることを読みました。また、特定の暗号化アルゴリズムでは、暗号化された各パケットのサイズが固定長であると想定していることも読みました。暗号化される最後のパケットが必要なサイズでない場合、暗号化は失敗します。したがって、最初に16進数などの固定長に変換されたデータを暗号化することをお勧めします。

使用されている暗号化アルゴリズムに関係なく、一般的に役立つベストプラクティスを特定しようとしています。さまざまな言語やプラットフォーム間でデータを暗号化および復号化する際の互換性を最大化するために、プロセスとして次の手順について批評したいと思います。

暗号化:

  • プレーンテキストの文字列で開始
  • プレーンテキスト文字列をバイト配列に変換します
  • バイト配列を16進数に変換します
  • 16進数を暗号化された文字列に暗号化する
  • 暗号化された文字列で終わる

復号化:

  • 暗号化された文字列で始まる
  • 暗号化された文字列を16進数に復号化します
  • 16進数をバイト配列に変換する
  • バイト配列をプレーンテキスト文字列に変換します
  • プレーンテキスト文字列で終了します
4

4 に答える 4

2

あなたの前提は正しいですが、ある意味ではそれよりも少し簡単です。最新の暗号化アルゴリズムは、言語に依存しないことを意図しており、同一のキーを持つ同一の入力があれば、同一の結果が得られるはずです

ほとんどの暗号と一部のモードでは、データを固定長にする必要があるのは事実です。データは固定境界で終了する必要があるため、16 進数に変換してもうまくいきません。たとえば、AES では、4 バイトを暗号化する場合、16 バイトにパディングする必要がありますが、16 進表現ではできません。幸いなことに、これは、標準のパディング スキームの 1 つを使用して、最終的に使用する暗号 API 内で発生する可能性が最も高いでしょう。言語にタグを付けていないので、.NET の AesManaged クラスがサポートするパディング モードのリストを次に示します。

反対に、データを適切に暗号化するには、単なるバイト エンコーディング以上のものが必要です。正しい操作モード (CBC または CTR が推奨されます) を選択してから、ある種のメッセージの整合性を提供する必要があります。暗号化だけでは、データの改ざんを防ぐことはできません。物事を少し単純化したい場合は、機密性と整合性の両方を処理するGCMのようなモードを見てください。

スキームは次のようになります。

  • プレーンテキストを文字列からバイト配列に変換します。文字エンコーディングに関する重要な注意事項については、@rossum のコメントを参照してください。
  • ランダムな対称キーを生成するか、PBKDF2を使用してパスフレーズをキーに変換します
  • GCM で使用するランダムな IV/ノンスを生成する
  • バイト配列を暗号化し、認証タグとともに保存します
  • オプションで、バイト配列をBase64 文字列として格納することもできます。

復号化の場合:

  • バイト配列を Base64 文字列として格納した場合は、バイト配列に変換して戻します。
  • 暗号化されたバイト配列を平文に復号化する
  • 結果の認証タグが保存された認証タグと一致することを確認します
  • バイト配列をプレーン テキスト文字列に変換します。
于 2013-01-09T21:13:53.757 に答える
2

暗号化の実際のベスト プラクティスは、高レベルの暗号化フレームワークを使用することです。プリミティブを使用すると、間違った操作を行う可能性がたくさんあります。また、mfanto は、高レベルの暗号化フレームワークを使用しない場合に知っておく必要がある重要なことをうまく説明しています。そして、プログラミング言語間の互換性を最大化しようとしているのは、他の開発者が暗号化と相互運用する必要があり、暗号化の操作の低レベルの詳細も学ぶ必要があるためだと思います.

したがって、高レベルのフレームワークに対する私の提案は、Google Keyczarフレームワークを使用することです。これは、アルゴリズム、キー管理、パディング、iv、認証タグ、ワイヤ形式の詳細をすべて処理するためです。また、Java、Python、C++C#、およびGoなど、さまざまなプログラミング用に存在します。見てみな。

私は C# バージョンを作成したので、その背後で使用されるプリミティブは、他のほとんどのプログラミング言語でも広く利用可能であり、鍵の管理と保存に json などの標準を使用していることがわかります。

于 2013-01-10T14:16:33.250 に答える
0

文字列自体ではなく、文字列のバイト配列を暗号化するのがベスト プラクティスであることを読みました。

暗号化アルゴリズムは通常、バイト配列またはバイトストリームで機能するため、そうです。オブジェクト (文字列) を直接暗号化するのではなく、そのバイト表現を暗号化します。

また、特定の暗号化アルゴリズムは、暗号化された各パケットのサイズが固定長であることを想定していることを読みました。暗号化する最後のパケットが必要なサイズでない場合、暗号化は失敗します。

これは、選択した特定の暗号化アルゴリズムの実装の詳細です。それは、アルゴリズムに対する API インターフェイスが何であるかに大きく依存します。

一般的に言えば、はい、暗号化アルゴリズムは入力を固定サイズのブロックに分割します。最後のブロックがいっぱいでない場合、最後に任意のバイトを埋め込んで、完全なチャンクを取得できます。パディングされたデータと、たまたまパディングのように見えるバイトが末尾にあるデータを区別するために、プレーン テキストの長さをバイト ストリームの先頭または末尾に追加します。

これは、ユーザーに任せるべきではない種類の詳細であり、優れた暗号化ライブラリがこれらの詳細を処理します。理想的には、プレーン テキストのバイトをフィードして、反対側で暗号化されたバイトを取得したいだけです。

したがって、最初に 16 進数などの固定長に変換されたデータを暗号化することをお勧めします。

バイトを 16 進数に変換しても、固定長にはなりません。サイズが 2 倍になりますが、それは固定されていません。ASCII セーフになるため、テキスト ファイルや電子メールに簡単に埋め込むことができますが、ここでは関係ありません。(そして、Base64 は、16 進数よりも優れたバイナリ→ASCII エンコーディングです。)

さまざまな言語やプラットフォーム間でのデータの暗号化および復号化との互換性を確保するためのベスト プラクティスを特定するために、プロセスとして次の手順について批評したいと思います。

暗号化:

  • プレーンテキスト文字列
  • プレーンテキスト文字列をバイト配列に変換する
  • バイト配列を16進数に変換
  • 16 進数を暗号化された文字列に暗号化する
  • 暗号化された文字列
  • プレーン テキストのバイト配列から暗号化されたバイト配列へ

復号化:

  • 暗号化された文字列
  • 暗号化された文字列を 16 進数に復号化する
  • 16 進数をバイト配列に変換する
  • 暗号化されたバイト配列
  • 暗号化されたバイト配列を平文のバイト配列に復号化する
  • バイト配列をプレーンテキスト文字列に変換する
  • プレーンテキスト文字列

暗号化するには、プレーン テキスト文字列をそのバイト表現に変換してから、これらのバイトを暗号化します。結果は、暗号化されたバイト配列になります。

選択した方法で、バイト配列を他のプログラムに転送します。

復号化するには、暗号化されたバイト配列をプレーン テキストのバイト配列に復号化します。このバイト配列から文字列を構築します。終わり。

于 2013-01-09T21:10:38.397 に答える