使用AES

时间:2018-03-28 22:09:45

标签: java encryption aes

我尝试使用AES加密/解密python和java中的字符串,并且两者的加密结果相同。加密工作正常,但是当我尝试解密java中的字符串时,它会向我显示此错误(javax.crypto.IllegalBlockSizeException:当使用填充密码解密时,输入长度必须是16的倍数)。在python中它工作正常。 java解密有什么问题?

private static String toHexString(byte[] data) {        
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < data.length; ++i) {
        String s = Integer.toHexString(data[i] & 0XFF);
        buf.append((s.length() == 1) ? ("0" + s) : s);
    }
    return buf.toString();
}

public static String encrypt(String input, String key) {
    byte[] crypted = null;
    try {
        SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skey);
        crypted = cipher.doFinal(input.getBytes());
        final String encryptedString = toHexString(Base64.encodeBase64(crypted));
        return encryptedString;
    } catch (Exception e) {
        System.out.println(e.toString());
    }
    return "";
}




  public static String decrypt(String encrypted, String key)  {
         char[] ch= encrypted.toCharArray();
    try {

        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher2.init(Cipher.DECRYPT_MODE, skeySpec);

       byte[] h =Hex.decodeHex(ch);

     String de = new String(Base64.decodeBase64(cipher2.doFinal(Hex.decodeHex(ch))),"UTF-8");  

    return de; 
    } catch (Exception e) {
        System.out.println(e.toString());
    }
    return null;
}

1 个答案:

答案 0 :(得分:1)

很简单,你应该在解密之前执行base 64解码,而不是之后。

以下是密文基于64编码的示例。没有理由执行base 64 十六进制编码,你可以做其中任何一个,但是使用两者都没有意义。

我使用了替代的Base64编解码器,但没有指定您使用的是哪一种。

警告:不要复制下面的代码,它不安全;它只提供问题的直接答案。

public static String encrypt(String input, String key) {
    byte[] crypted = null;
    try {
        SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skey);
        crypted = cipher.doFinal(input.getBytes());
        final String encryptedString = Base64.toBase64String(crypted);
        return encryptedString;
    } catch (Exception e) {
        System.out.println(e.toString());
    }
    return "";
}

public static String decrypt(String encrypted, String key) {
    // char[] ch= encrypted.toCharArray();
    try {

        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher2.init(Cipher.DECRYPT_MODE, skeySpec);

        // byte[] h = Hex.decode(encrypted);

        String de = new String(cipher2.doFinal(Base64
                .decode(encrypted)), "UTF-8");

        return de;
    } catch (Exception e) {
        System.out.println(e.toString());
    }
    return null;
}

我认为这是出于学习目的,因为代码存在许多问题,例如:使用字符串中的键,ECB模式加密等等。