Cipherを使用したとき、次のことを確認しました。
暗号化コード:
Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.ENCRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
復号化コード:
Cipher aes = Cipher.getInstance("AES");
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
Decrypt コードを実行すると、 IllegalBlockSizeException ( Input length must be multiple of 16 when ...) が発生します。
しかし、復号化コードを
Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding"); //I am passing the padding too
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
それは正常に動作します。パターンにあることが分かりますalgorithm/mode/padding
。パディングについて言及していなかったからだと思いました。そこで、暗号化中にモードとパディングを与えてみましたが、
暗号化コード:
Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");//Gave padding during encryption too
aes.init(Cipher.ENCRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
復号化コード:
Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");
aes.init(Cipher.DECRYPT_MODE, generateKey());
byte[] ciphertext = aes.doFinal(rawPassword.getBytes());
しかし、IllegalBlockSizeException で失敗します。
理由、例外の理由、およびその下で正確に何が起こっているのか。誰かが助けることができれば?前もって感謝します
アップデート
問題は、暗号化および復号化する文字列にあるようです。私が言ったコードでさえ、いつもうまくいくとは限らないからです。基本的に UUID を暗号化しています (例: 8e7307a2-ef01-4d7d-b854-e81ce152bbf6)。特定の文字列で機能し、他の特定の文字列では機能しません。
暗号化された文字列の長さは 64 で、16 で割り切れます。はい、同じマシンで実行しています。
秘密鍵の生成方法:
private Key generateKey() throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA");
String passphrase = "blahbl blahbla blah";
digest.update(passphrase.getBytes());
return new SecretKeySpec(digest.digest(), 0, 16, "AES");
}