以下のように、単純な 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 の場合、復号化に失敗した場合、復号化が失敗したことはわかりますが、復号化から間違ったバイトが得られるとは思いませんでしたか? これはひどいです...