【问题标题】:Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters [duplicate]线程“main”java.security.InvalidKeyException中的异常:非法密钥大小或默认参数[重复]
【发布时间】:2013-11-20 07:14:20
【问题描述】:

下面的代码抛出这个错误信息:

Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters

Cipher dcipher;

byte[] salt = new String("12345678").getBytes();
int iterationCount = 1024;
int keyStrength = 256;
SecretKey key;
byte[] iv;

Decrypter(String passPhrase) throws Exception {
    SecretKeyFactory factory = SecretKeyFactory
            .getInstance("PBKDF2WithHmacSHA1");
    System.out.println("factory +" + factory);
    KeySpec spec = new PBEKeySpec(passPhrase.toCharArray(), salt,
            iterationCount, keyStrength);
    System.out.println("spec  " + spec);
    SecretKey tmp = factory.generateSecret(spec);
    System.out.println();
    key = new SecretKeySpec(tmp.getEncoded(), "AES");
    dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
}

public String encrypt(String data) throws Exception {
    dcipher.init(Cipher.ENCRYPT_MODE, key);
    AlgorithmParameters params = dcipher.getParameters();
    iv = params.getParameterSpec(IvParameterSpec.class).getIV();
    byte[] utf8EncryptedData = dcipher.doFinal(data.getBytes());
    String base64EncryptedData = new sun.misc.BASE64Encoder()
            .encodeBuffer(utf8EncryptedData);

    System.out.println("IV "
            + new sun.misc.BASE64Encoder().encodeBuffer(iv));
    System.out.println("Encrypted Data " + base64EncryptedData);
    return base64EncryptedData;

有人知道我为什么会收到这个错误吗?

【问题讨论】:

  • 异常在哪一行被抛出?请标记
  • 您是否安装了Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File?除非将该文件安装到您的计算机上,否则无法使用 256 位 AES(来自 Java 加密包)。
  • 对于这个问题我不得不下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8

标签: java jce


【解决方案1】:

从 JDK 1.8u151 开始,无需单独下载 JCE 库。简单编辑:

$JDK_HOME/jre/lib/security/java.security

并取消注释该行:

crypto.policy=unlimited

【讨论】:

    【解决方案2】:

    如果您将 Mac 与 homebrew 一起使用

    brew cask install jce-unlimited-strength-policy
    

    【讨论】:

      【解决方案3】:

      从此链接下载 JCE for Java 7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

      并打开路径C:\Program Files\Java\jdk1.7.0_80\jre\lib\security 并在此处粘贴两个罐子。(即使两个罐子已经存在,替换这两个罐子)

      【讨论】:

        【解决方案4】:

        您可能还没有安装 JCE 策略文件。

        下载此文件:

        并将文件安装在${java.home}/jre/lib/security/.

        ${java.home}指的是你的Java安装目录

        Mac 版:

        • 打开查找器
        • 命令 + shift + g
        • 输入/Library/Java/JavaVirtualMachines
        • 导航到您的 JDK 版本
        • 然后Contents/Home/jre/lib/security
        • 解压下载的文件并将所有文件放在这里

        对于 CLI

        unzip downloaded_policy_file.zip  -d /Library/Java/JavaVirtualMachines/<JDK_VERSION>/Contents/Home/jre/lib/security/
        
        mv /Library/Java/JavaVirtualMachines/<JDK_VERSION>/Contents/Home/jre/lib/security/UnlimitedJCEPolicyJDK<VERSION>/* /Library/Java/JavaVirtualMachines/<JDK_VERSION>/Contents/Home/jre/lib/security  
        
        rm -rf Library/Java/JavaVirtualMachines/<JDK_VERSION>/Contents/Home/jre/lib/security/UnlimitedJCEPolicyJDK<VERSION>/
        

        【讨论】:

        • 但是为什么我们必须明确粘贴下载的罐子,因为它已经包含相同的......
        • 如果我们使用 Netbeans 怎么添加它们???
        【解决方案5】:

        对于 JAVA 7,下载链接是 jce-7-download

        把下载的两个jar包复制到Java\jdk1.7.0_10\jre\lib\security 备份旧的罐子以更安全。

        【讨论】:

        • 但是为什么我们必须明确下载和粘贴 Jars,即使它已经有相同的......
        • jar 的内容不同。例如,原始 jar 限制了可能的密钥长度,因此加密相当弱。我认为这是基于美国的出口政策。
        猜你喜欢
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2018-08-21
        • 2014-01-15
        • 1970-01-01
        相关资源
        最近更新 更多