【问题标题】:Java AES encryption errorJava AES 加密错误
【发布时间】:2018-06-20 16:37:23
【问题描述】:

我想用AES 加密技术加密消息。 当我使用此代码时,我遇到了一些错误

java.security.InvalidKeyException: Illegal key size or default parameters

我的加密代码:

public class Encryption {

    public static class MessageEncrypt {

        public static class AES {
            private final static String ALGO = "AES";
            private String secretKey;
            private String data;

            public String encrypt(String secretKey, String data) throws Exception {
                SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
                KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), secretKey.getBytes(), 128, 256);
                SecretKey tmp = factory.generateSecret(spec);
                SecretKey key = new SecretKeySpec(tmp.getEncoded(), ALGO);
                Cipher cipher = Cipher.getInstance(ALGO);
                cipher.init(Cipher.ENCRYPT_MODE, key);
                return toHex(cipher.doFinal(data.getBytes()));
            }

            public String decrypt(String secretKey, String data) throws Exception {
                SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
                KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), secretKey.getBytes(), 128, 256);
                SecretKey tmp = factory.generateSecret(spec);
                SecretKey key = new SecretKeySpec(tmp.getEncoded(), ALGO);
                Cipher cipher = Cipher.getInstance(ALGO);
                cipher.init(Cipher.DECRYPT_MODE, key);
                return new String(cipher.doFinal(toByte(data)));
            }

            private static byte[] toByte(String hexString) {
                int len = hexString.length() / 2;
                byte[] result = new byte[len];
                for (int i = 0; i < len; i++)
                    result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue();
                return result;
            }

            public static String toHex(byte[] stringBytes) {
                StringBuffer result = new StringBuffer(2 * stringBytes.length);
                for (int i = 0; i < stringBytes.length; i++) {
                    result.append(HEX.charAt((stringBytes[i] >> 4) & 0x0f)).append(HEX.charAt(stringBytes[i] & 0x0f));
                }
                return result.toString();
            }

            private final static String HEX = "0123456789ABCDEF";
        }
    }

    static class DataEncrypt {

    }

}

我的测试计划:

public class Testing {

    public static void main(String[] args) throws Exception {

        AES cryptoAES = new AES();
        System.out.println(cryptoAES.encrypt("43234sfeff", "re"));

    }

}

当我运行这个时,我得到了这个错误:

Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1021)
    at javax.crypto.Cipher.implInit(Cipher.java:796)
    at javax.crypto.Cipher.chooseProvider(Cipher.java:859)
    at javax.crypto.Cipher.init(Cipher.java:1229)
    at javax.crypto.Cipher.init(Cipher.java:1166)
    at com.detroit.Encryption$MessageEncrypt$AES.encrypt(Encryption.java:35)
    at testing.Testing.main(Testing.java:10)

在 Android Studio 中工作:

But the Same code working in Android (Android Studio), but when i run the same code in netbeans i got such kind of errors.

【问题讨论】:

标签: java android encryption aes


【解决方案1】:

您也可以使用没有此限制的OpenJDK

任何从事密码学工作的人都知道,密码代码的导入/导出涉及复杂的法律问题。 OpenJDK 中的 JCE 具有开放的加密接口,这意味着它不限制可以使用哪些提供程序。

编辑:由于我太菜鸟,我无法回复 Jens 的评论。

【讨论】:

    【解决方案2】:

    如果您没有安装 JCE (Java Cryptography Extension),则会出现此异常。

    对于 Java 8,您可以找到 JCE 包 here

    【讨论】:

    • @Downvoter 请解释为什么如果不是你的downvote 没有真正的帮助
    【解决方案3】:

    最简单的解决方案是将您的 jdk 升级到 jdk1.8.0_161 或更高版本。

    有一个好消息,Java 打包从 jdk1.8.0_161 开始捆绑了有限和无限制的策略 jar,默认情况下它使用无限制的策略设置。 所以,我们需要做的就是使用升级的java版本(jdk1.8.0_161或更高版本

    java安装包默认自带128位的key大小,这里使用的key好像更大。

    为了使其正常工作,我们需要从here 安装 java 加密扩展无限强度策略 jar。

    您需要使用无限强度策略 jar 更新 java 安全策略 jar。


    安装

    注意事项:

    • Unix (Solaris/Linux/Mac OS X) 和 Windows 使用不同的路径名 分隔符,所以请使用适当的分隔符(“\”、“/”) 环境。

    •(下)指的是 JRE 所在的目录 安装。根据你是否运行JCE来确定 在 Java 开发工具包中包含的 JRE 或 JRE 上,或 JDK(TM)。 JDK 包含 JRE,但在不同级别 文件层次结构。例如,如果 JDK 安装在 /home/user1/jdk1.8.0 在 Unix 上或在 C:\jdk1.8.0 在 Windows 上,然后 是:

    /home/user1/jdk1.8.0/jre [Unix] C:\jdk1.8.0\jre [Windows]

    另一方面,如果 JRE 安装在 /home/user1/jre1.8.0 在 Unix 上或在 Windows 上的 C:\jre1.8.0 中,JDK 不是 安装好了,那么就是:

    /home/user1/jre1.8.0 [Unix] C:\jre1.8.0 [Windows]

    • 在 Windows 上,对于每个 JDK 安装,可能有额外的 JRE 安装在“Program Files”目录下。请做出来 确保安装无限强度策略 JAR 文件 适用于您计划使用的所有 JRE。

    以下是安装说明:

    1.here 下载、解压缩并提取无限强度 JCE 策略文件。

    这将创建一个名为 UnlimitedJCEPolicyJDK8 的子目录。 该目录包含以下文件:

    local_policy.jar             Unlimited strength local policy file
    US_export_policy.jar         Unlimited strength US export policy file
    

    2. 复制无限强度策略 JAR 文件。 这些文件已经存在,我们需要用附件替换。

    <java-home>/lib/security           [Unix]
    <java-home>\lib\security           [Windows]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      相关资源
      最近更新 更多