Java me J2ME AES解密错误(org.bouncycastle.crypto.InvalidCipherTextException:pad块损坏)
我正在使用AES算法和bouncy castle进行加密和解密 我的加密和解密工作正常,但当我的纯文本大小较大时,它会给我错误 甚至有时它也会提供未解密的数据Java me J2ME AES解密错误(org.bouncycastle.crypto.InvalidCipherTextException:pad块损坏),java-me,aes,encryption,bouncycastle,midlet,Java Me,Aes,Encryption,Bouncycastle,Midlet,我正在使用AES算法和bouncy castle进行加密和解密 我的加密和解密工作正常,但当我的纯文本大小较大时,它会给我错误 甚至有时它也会提供未解密的数据 public static boolean setEncryptionKey(String keyText) { byte[] keyBytes = keyText.getBytes(); key = new KeyParameter(keyBytes); engine = new AESFastEngine()
public static boolean setEncryptionKey(String keyText)
{
byte[] keyBytes = keyText.getBytes();
key = new KeyParameter(keyBytes);
engine = new AESFastEngine();
cipher = new PaddedBufferedBlockCipher(engine);
return true;
}
加密:
public static String encryptString(String plainText)
{
byte[] plainArray = plainText.getBytes();
cipher.init(true, key);
byte[] cipherBytes = new byte[cipher.getOutputSize(plainArray.length)];
int cipherLength = cipher.processBytes(plainArray, 0, plainArray.length, cipherBytes, 0);
cipher.doFinal(cipherBytes, cipherLength);
String cipherString = new String(cipherBytes);
return cipherString;
}
public static String decryptString(String encryptedText)
{
byte[] cipherBytes = encryptedText.getBytes();
cipher.init(false, key);
byte[] decryptedBytes = new byte[cipher.getOutputSize(cipherBytes.length)];
int decryptedLength = cipher.processBytes(cipherBytes, 0, cipherBytes.length, decryptedBytes, 0);
cipher.doFinal(decryptedBytes, decryptedLength);
String decryptedString = new String(decryptedBytes);
int index = decryptedString.indexOf("\u0000");
if (index >= 0)
{
decryptedString = decryptedString.substring(0, index);
}
return decryptedString;
}
解密:
public static String encryptString(String plainText)
{
byte[] plainArray = plainText.getBytes();
cipher.init(true, key);
byte[] cipherBytes = new byte[cipher.getOutputSize(plainArray.length)];
int cipherLength = cipher.processBytes(plainArray, 0, plainArray.length, cipherBytes, 0);
cipher.doFinal(cipherBytes, cipherLength);
String cipherString = new String(cipherBytes);
return cipherString;
}
public static String decryptString(String encryptedText)
{
byte[] cipherBytes = encryptedText.getBytes();
cipher.init(false, key);
byte[] decryptedBytes = new byte[cipher.getOutputSize(cipherBytes.length)];
int decryptedLength = cipher.processBytes(cipherBytes, 0, cipherBytes.length, decryptedBytes, 0);
cipher.doFinal(decryptedBytes, decryptedLength);
String decryptedString = new String(decryptedBytes);
int index = decryptedString.indexOf("\u0000");
if (index >= 0)
{
decryptedString = decryptedString.substring(0, index);
}
return decryptedString;
}
这个解密给了我以下错误
org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted
at org.bouncycastle.crypto.paddings.PKCS7Padding.padCount(+30)
at org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal(+190)
at com.NewCrypto.decryptString(NewCrypto.java:103)
at com.New_Midlet.startApp(New_Midlet.java:23)
at javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:44)
at com.sun.midp.midlet.Scheduler.schedule(Scheduler.java:375)
at com.sun.midp.main.Main.runLocalClass(Main.java:477)
at com.sun.midp.main.Main.main(+80)
有什么问题吗?线路
String cipherString = new String(cipherBytes);
这是一只虫子
cipherBytes
是具有任意值的字节数组,不能使用任何Java字符串解码器将其转换为字符串。您应该将密码发送/保存为字节数组。如果必须将其设置为字符串,则必须使用编码器。通常使用Base64编码器,Base16(十六进制)编码器也是如此。您可以使用或我最喜欢的。在我看来,任何仍然输出字节而不是字符的base64编码器都有点愚蠢。当有人试图将其流式传输到UTF-16XML文件时,我已经看到了这种恐怖。此外,除了默认的base64之外,它似乎不支持任何其他形式的base64。嗯,也许我也应该提供我的编码器。@owlstead:我同意。更硬的编解码器将输出字符串,并支持愚蠢的Apache commons样式。