java - 尝试理解在标记重复之前 : InvalidKeyException: Illegal key size

标签 java arrays encryption aes decoding

实际上,我收到 InvalidKeyException: 非法 key 大小,但相同的代码正在生产中运行。当我尝试在本地运行此代码时,在以下行中解码时遇到 key 大小问题:

 cipher.init(2, new SecretKeySpec(secretKey, "AES"), new IvParameterSpec(initVector));

在上面的行中,我遇到以下异常:

 public byte[] getPageByteStream(String fileName)
    throws DMSApplicationException
  {
    logger.info(GridFsPagesDAOImpl.class + " Entering in to getPageByteStream DAO Method : " + fileName);

    Query searchQuery = new Query(Criteria.where("filename").is(fileName));
    GridFSDBFile gridFSDBFile = DmsDBUtils.getGridFsOperations().findOne(searchQuery);

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    byte[] results = null;
    byte[] initVector = null;
    try {
      gridFSDBFile.writeTo(stream);
      byte[] bytes = null;
      bytes = stream.toByteArray();
      Base64 base64 = new Base64();
      byte[] decodedArr = base64.decode(bytes);
      byte[] decArr = Arrays.copyOfRange(decodedArr, 24, bytes.length);
    byte[] secretKey = base64.decode("mkJmh3d2WLNXgmWIv4znTU+IXk7XczlInO9mXmv1iBE=\n");
     String str = new String(secretKey, "UTF-8");
     System.out.println("decodes string :  "+str);
     Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
      initVector = Arrays.copyOfRange(decodedArr, 8, 24);

      cipher.init(2, new SecretKeySpec(secretKey, "AES"), new IvParameterSpec(initVector));
      decArr = Arrays.copyOfRange(decodedArr, 24, bytes.length);
      byte[] decArr1 = Arrays.copyOfRange(decArr, 0, decArr.length - decArr.length % 16);

      results = cipher.doFinal(decArr1);

    } catch (Exception e) {
      e.printStackTrace();
      logger.info(GridFsPagesDAOImpl.class + " Exiting from getPageByteStream DAO Method " + e);


      if (gridFSDBFile != null) {
        try {
          stream.close();
        } catch (IOException ex) {
          ex.printStackTrace();
        }
      }
    }
    finally
    {
      if (gridFSDBFile != null) {
        try {
          stream.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }

    logger.info(GridFsPagesDAOImpl.class + " Exiting from getPageByteStream DAO Method " + fileName);
    return results;
  }
}

你能给我推荐一下吗?

非常感谢您的帮助。

最佳答案

看起来您正在使用带有 256 位 key 的 AES。

您需要安装 Java 加密扩展 (JCE) 无限强度管辖策略文件才能使用大于 128 位的 key 。

http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

关于java - 尝试理解在标记重复之前 : InvalidKeyException: Illegal key size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46362489/

相关文章:

java - 在动态edittext和textview中设置id

python - 将 float 重载到 numpy 数组

mysql - Coldfusion中如何对mysql数据库进行加密和使用

c# - 如何使用 X509Certificate 和 AES-256 算法加密/解密文本

java - 如何以编程方式获取带有类和限定符的 bean?

java - 将 Java Hashmap 发送到 JSNI (Javascript)

C编程,从文件中读取并加载到数组中

php - libsodium PHP 将私钥存储在文件中

java - Spring Boot 单元测试中的 Mocking Files.copy

arrays - Ruby - 转换多个数组以生成哈希