3

BouncyCastle を使用して、モードAESでいくつかのファイルを暗号化/復号化するために使用しています。 復号化のキーが間違っていることを証明していますが、例外はありません。 キーが間違っていることを確認するにはどうすればよいですか? 私のコードはこれです: GCM


    SecretKeySpec   incorrectKey = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
    Cipher          cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
    byte[] block = new byte[1048576];
    int i;

    cipher.init(Cipher.DECRYPT_MODE, incorrectKey, ivSpec);

    BufferedInputStream fis=new BufferedInputStream(new ProgressMonitorInputStream(null,"Decrypting ...",new FileInputStream("file.enc")));
    BufferedOutputStream ro=new BufferedOutputStream(new FileOutputStream("file_org"));        
    CipherOutputStream dcOut = new CipherOutputStream(ro, cipher);

    while ((i = fis.read(block)) != -1) {
        dcOut.write(block, 0, i);
    }

    dcOut.close();
    fis.close();

ありがとう

4

2 に答える 2

4

GCM モードで不正なキーを検出する方法はありません。確認できるのは、認証タグが有効かどうかです。これは、正しいキーを使用していたことを意味します。問題は、認証タグが正しくない場合、これが次のそれぞれ (または、暗号文と認証タグの完全な置換を含むすべての組み合わせ) を示している可能性があることです。

  1. 不正なキーが使用されています。
  2. 転送中にカウンター モードで暗号化されたデータが変更されました。
  3. 追加の認証データが変更されました。
  4. トランスポート中に認証タグ自体が変更されました。

できることは、使用されている秘密鍵を識別するために追加のデータを送信することです。これは読み取り可能な識別子 ( "encryption-key-1") の場合もありますが、キー チェック値である KCV の場合もあります。KCV は通常、キーで暗号化されたゼロ ブロック、またはキーに対する暗号的に安全なハッシュ (フィンガープリントとも呼ばれます) で構成されます。ゼロ ブロックを介した暗号化では情報が漏洩するため、それを使用して暗号化キーを識別しないでください。

実際には、GCM モードの AAD 機能を使用して、キー識別データに対して認証タグを計算できます。フィンガープリントの侵害と不正なキーの使用を区別できないことに注意してください。ただし、IV、AAD、暗号文、および認証タグの構造全体よりも、フィンガープリントが誤って破損する可能性は低くなります。

于 2012-09-02T11:51:04.607 に答える
-6

を使用してNoPaddingいます。PKCS7Paddingこれを暗号化と復号化の両方に変更します。間違ったキーが使用された場合、パディングはほぼ確実に期待どおりに復号化できず、InvalidCipherTextExceptionがスローされます。

于 2012-09-02T10:30:02.630 に答える