代码适用于Windows JDK 7,但不适用于Linux JDK 7

时间:2013-04-16 08:18:09

标签: java linux windows encryption java-7

以下代码在Windows上的Oracle JDK 7中运行良好,但在Linux上出现以下错误失败:javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipherCipher.doFinal(ciphertextArray)这与使用完全相同的Jar文件完全相同的命令行等等 文本和密码的值来自命令行,我怀疑问题出在这里,我不知道在哪里......

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

2 个答案:

答案 0 :(得分:2)

观察结果似乎是由于两个平台上默认字符集的不同。

您需要确保使用指定的字符集执行Stringbyte[]次转换(反之亦然),而不是依赖于平台默认值。

答案 1 :(得分:0)

问题是文本字符串中包含“$”字符,而在Linux中的命令行中这些字符是转义字符。它们需要在String本身中转换为“\ $”。