1

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher次のコードは、Windows 上の Oracle の JDK 7 では問題なく動作しますが、Linux では次のエラーで失敗しますCipher.doFinal(ciphertextArray)コマンドラインですが、問題はここのどこかにあると思われます。どこにあるのかわかりません...

String saltD = text.substring(0,12);
String ciphertext = text.substring(12,text.length());

// BASE64Decode the bytes for the salt and the ciphertext
Base64 decoder = new Base64();
byte[] saltArray = decoder.decode(saltD);
byte[] ciphertextArray = decoder.decode(ciphertext);

// Create the PBEKeySpec with the given password
PBEKeySpec keySpec = new PBEKeySpec(password.trim().toCharArray());

// Get a SecretKeyFactory for PBEWithSHAAndTwofish
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(encryptionMethod);

// Create our key
SecretKey key = keyFactory.generateSecret(keySpec);

// Now create a parameter spec for our salt and iterations
PBEParameterSpec paramSpec = new PBEParameterSpec(saltArray, ITERATIONS);

// Create a cipher and initialize it for encrypting
Cipher cipher = Cipher.getInstance(encryptionMethod);
cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

// Perform the actual decryption
byte[] plaintextArray = cipher.doFinal(ciphertextArray);
return new String(plaintextArray);
4

2 に答える 2

2

これは、2 つのプラットフォームのデフォルトの文字セットの違いによるものと思われます。

プラットフォームのデフォルトに依存するのではなく、指定されStringた文字セットを使用してtobyte[]変換 (およびその逆) が実行されるようにする必要があります。

于 2013-04-16T09:09:02.413 に答える
0

問題は、テキスト文字列に「$」文字が含まれており、Linux のコマンド ラインからはこれらがエスケープ文字であるということでした。文字列自体で「\$」に変換する必要があります。

于 2013-04-17T03:00:06.490 に答える