我正在开发一个应用程序,我正在加密和解密用户输入的文本 但是,我收到以下错误:
javax.crypto.IllegalBlockSizeException:最后一个块未完成 解密
下面是我的加密和解密代码。加密工作完美,而我在解密时遇到此错误。请参考以下代码:
public static String fncEncrypt(String strClearText, String strKey) throws Exception{
String strData = "";
try {
SecretKeySpec sKeySpec = new SecretKeySpec(strKey.getBytes(), "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);
byte[] encrypted = cipher.doFinal(strClearText.getBytes());
strData = new String(encrypted);
}catch (Exception e){
e.printStackTrace();
}
return strData;
}
public static String fncDecrypt(String strEecrypted, String strKey) throws Exception {
String strData = "";
try {
SecretKeySpec skeySpec = new SecretKeySpec(strKey.getBytes(), "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(strEecrypted.getBytes());
strData = new String(decrypted);
}catch (Exception e){
e.printStackTrace();
}
return strData;
}
如果您有解决方案,请回复。
答案 0 :(得分:0)
您应该在方法的开头解码字符串,而不是编码字符串的平台特定表示。
byte[] base64TextToDecrypt = Base64.decodeBase64(textToDecrypt);
或更确切地说:
byte[] bytesToDecrypt = Base64(base64TextToDecrypt);
如果您正确命名变量。
通常,每次(感觉必须)使用String.getBytes():byte []方法或String(byte [])构造函数时,您可能会做错事。您应首先考虑您要做的事情,并指定字符编码,如果您确实需要使用它。
在您的情况下,转换后的变量中的输出可能是字符编码的。所以你可以使用以下片段:
String plainText = new String(converted, Charset.forName("UTF8"));
System.out.println(plainText);
而不是你现在拥有的。
答案 1 :(得分:0)
String
类方法getBytes()
或new String(byte bytes[])
使用Charset.defaultCharset().name()
进行编码/解码,使用特殊字符集进行编码会忽略某些加密数据。
您可以直接通过fncEncrypt
返回byte []并将byte []输入fncDecrypt
。或使用BASE64
编码结果。
public static byte[] fncEncrypt(String strClearText, String strKey) throws Exception{
byte[] encrypted = null;
try {
SecretKeySpec sKeySpec = new SecretKeySpec(strKey.getBytes(), "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);
encrypted = cipher.doFinal(strClearText.getBytes());
} catch (Exception e){
e.printStackTrace();
}
return encrypted;
}
public static String fncDecrypt(byte[] ecrypted, String strKey) throws Exception {
String strData = "";
try {
SecretKeySpec skeySpec = new SecretKeySpec(strKey.getBytes(), "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(ecrypted);
strData = new String(decrypted);
}catch (Exception e){
e.printStackTrace();
}
return strData;
}
答案 2 :(得分:0)
原因是当您使用new String(encrypted)
时,它不会将字节完全编码为字符串。请尝试以下代码
public static byte[] fncEncrypt(String strClearText, String strKey) throws Exception{
SecretKeySpec sKeySpec = new SecretKeySpec(strKey.getBytes(), "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);
byte[] encrypted = cipher.doFinal(strClearText.getBytes());
return encrypted;
}
public static String fncDecrypt(byte[] encrypted, String strKey) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(strKey.getBytes(), "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return new String(decrypted);
}
您可以使用以下代码加密和解密
String message = "Hello!";
byte[] encrypted = fncEncrypt(message, "key");
String decrypted = fncDecrypt(encrypted, "key");
System.out.println(decrypted);