14

暗号化されたメッセージをサーバーからクライアントに、またはその逆に送信するときに、AESとHMAC(SHA-256に基づく)を適切な方法で使用する方法が少し混乱しています。

次の方法が間違っている場合は、訂正してください。

  1. キーファイルから安全なキーを取得します(たとえば、AES-256を使用することをお勧めしますが、すでに有効な256ビット長のキーがあります)
  2. AES-256のランダムIVを生成して、同じプレーンテキストの暗号化出力が異なることを確認します。
  3. プレーンテキストと安全なキーを使用してHMAC-SHA-256を計算します。(最初の質問:HMAC計算にIVを使用する必要がありますか?たとえば、セキュアキーに追加しますか?)
  4. AES-256を使用してプレーンテキストを暗号化します。
  5. 次のようにクライアントへのメッセージを作成します:HMAC + IV + ENCRYPTED_MESSAGE

最大の質問は、どういうわけかIVをクライアントに送信せずに、同じ方法で生成し、暗号化に対して安全である可能性があるかどうかです。それともIVを送っても大丈夫ですか?

同じプレーンテキストが異なる暗号化結果になる必要があるため、ランダムなIV生成になります。

4

1 に答える 1

14

hmac(message)、aes(message)を送信しないでください。同じメッセージを2回送信すると、誰にでもわかります。さらに、パディングオラクル攻撃などの攻撃を防ぐために暗号文をマックする必要があります。

IV:一般に、ivを処理する簡単な方法は、固定長であるため、暗号文の前にivを追加することです。その後、復号化する前にそれらのバイトを読み取ることができます。IVは公開できますが、ランダムである必要があります。

HMAC:ライブラリがサポートしている場合、最も簡単な方法は、AESをGCMモード(または、あまり好ましくないがEAX)で使用することです。これは実際にはHMACではありませんが、同様に優れた認証付き暗号化を提供します。これらがサポートされていない場合:

ivと暗号文の両方でhmacを計算する必要があります。||の場合 連結です(バイト配列を処理する場合は、たとえば配列コピーで実行できます)。

CipherText = iv|| aes(key1,iv,message)  
tag = hmac(key2,ciphertext)

次に、(tag、CipherText)を送信します。もう一方の端では、同じhmac呼び出しを実行してタグを再生成し、受信したタグを計算されたタグと比較します。タグのsha1またはsha256ハッシュを直接ではなく比較して、比較が失敗した場所でリークしないようにします。

hmacには別のキーを使用する必要があります。実際には、暗号化キーのsha1sumをタックするだけで十分です。

于 2012-04-24T01:44:13.407 に答える