1

以下のように、単純な Java AES 暗号化と復号化を作成しました (学習目的で)。

//Encryption 
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
 String encryptedString = Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes()));
return encryptedString;

//Decryption
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
String decryptedString = new String(cipher.doFinal(Base64.decodeBase64(strToDecrypt)));
return decryptedString;

暗号鍵は可変長の文字列です。文字列を MD5 ハッシュして 128 ビットの鍵を取得します。

同じキーを使用してデータを正常に暗号化および復号化できます。しかし、間違ったキーでデータを復号化すると、以下の例外が発生しました。

javax.crypto.BadPaddingException: Given final block not properly padded

実際に私が期待しているのは、間違ったキーの復号化から生成された間違ったバイトですが、上記のようにスローされた例外ではありません。間違ったバイトが生成された場合、ハッカーは復号化が正しいかどうかわからない可能性があるためです。上記のように例外がスローされた場合、ブルート フォースの出力が判別しやすくなります。

それで、私のコードはどうなりますか?

編集:

私はここで間違いを犯したと思います。ハッカーは私のプログラムを使用して解読しない可能性があります。したがって、AES の場合、復号化に失敗した場合、復号化が失敗したことはわかりますが、復号化から間違ったバイトが得られるとは思いませんでしたか? これはひどいです...

4

1 に答える 1

5

コードに問題はありません (ただし、プラットフォームのエンコーディングに依存するのではなく、文字とバイト間の変換にエンコーディングを指定することで、コードをより堅牢にすることができます)。パディングには特定の形式があるため、復号化後に削除できます。間違ったキーで復号化すると、パディングも文字化けして削除できなくなります。これにより、例外が発生します。

ほとんどの場合、攻撃者は、パディングのためだけでなく、間違ったキーを取得したことに気付くでしょう。通常、データバイトには何らかの構造 (特定のファイル形式など) が含まれているか、あなたの場合、彼は異常な文字や無効な文字エンコーディングを検出します。たとえば、UTF-8 を例にとると、すべてのバイナリ文字列が有効な UTF-8 エンコーディングであるとは限りません。

于 2013-10-04T04:31:25.470 に答える