如何解密文本?

时间:2018-01-08 05:32:15

标签: java android encryption

我正在开发一个应用程序,我正在加密和解密用户输入的文本 但是,我收到以下错误:

  

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

如果您有解决方案,请回复。

3 个答案:

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

而不是你现在拥有的。

参考:https://stackoverflow.com/a/13274072/8416317

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