21

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");
}
4

2 に答える 2