2013-04-16 4 views
1

Следующий код прекрасно работает в JDK 7 от Oracle в Windows, но не работает со следующей ошибкой в ​​Linux: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher в строке Cipher.doFinal(ciphertextArray) Это использует тот же самый файл Jar с таже командной строки и т.д. значения для текста и пароля поступают из командной строки, хотя и я подозреваю, что проблема находится где-то здесь, я просто понятия не имею, где ...Код работает на Windows JDK 7, но не на Linux JDK 7

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); 
+0

Чтобы убедиться, что это не ошибка, я бы запускал ее с последней версией каждого. Я подозреваю, что 1.7.0_09-icedtea слишком стар. –

+0

так, почему бы не использовать тот, который работает;) – Abraham

+0

Итак, я просто установил один и тот же JDK на другой тестовой машине, и он решил это. Поэтому я задал вопрос. Но теперь я помню, как что-то читал где-то о необходимости что-то делать с аргументами командной строки, потому что между Windows и Linux существует тонкая разница. Я просто не могу вспомнить, что, когда, где и как :( –

ответ

0

Проблема заключалась в том, что текстовая строка содержала в ней символы «$», а из командной строки в Linux это escape-символы. Они должны быть преобразованы в «\ $» в самой строке.

2

It что наблюдение связано с различием в кодировках по умолчанию на двух платформах.

Вы должны убедиться, что String к byte[] преобразования (и наоборот) осуществляется с помощью указано кодовых вместо того, чтобы полагаться на платформы по умолчанию.

Смежные вопросы