【问题标题】:java.lang.IllegalArgumentException: Empty keyjava.lang.IllegalArgumentException:空键
【发布时间】:2020-06-14 00:23:48
【问题描述】:
 public byte[] encryptWithAesKey(byte[] key, byte[] iv, byte[] data) {
      try {
             IvParameterSpec ivSpec = new IvParameterSpec(iv);
             Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
             SecretKeySpec aesKey = new SecretKeySpec(key, "AES");
             cipher.init(Cipher.ENCRYPT_MODE, aesKey, ivSpec);
             return cipher.doFinal(data);
          } catch (Exception e) {
             System.out.println("Error while encrypting: " + e.toString());
          }
     return null;
 }

在 javax.crypto.spec.SecretKeySpec.(SecretKeySpec.java:96)

这会返回异常,但在 android 28 更低版本中运行良好。

StackTrace如下:

System.out: encryptwithAES:[B@b8979fbIV:[B@78d7813data:[B@3841a50
System.err: java.lang.IllegalArgumentException: Empty key
System.err:    at javax.crypto.spec.SecretKeySpec.<init>(SecretKeySpec.java:96)
System.err:    at com..Security.SecurityController.encryptWithAesKey(SecurityController.java:93)
System.err:    at com..Controllers.Files.FileController.encryptAndSaveFile(FileController.java:75)
System.err:    at com..Controllers.Files.FileControllerRN.encryptAndSaveFileRN(FileControllerRN.java:68)
System.err:    at java.lang.reflect.Method.invoke(Native Method)
System.err:    at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
System.err:    at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151)
System.err:    at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
System.err:    at android.os.Handler.handleCallback(Handler.java:883)
System.err:    at android.os.Handler.dispatchMessage(Handler.java:100)
System.err:    at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
System.err:    at android.os.Looper.loop(Looper.java:214)
System.err:    at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
System.err:    at java.lang.Thread.run(Thread.java:919)

【问题讨论】:

  • 嗯,您的密钥似乎由零字节组成。哪一部分不清楚?
  • 1) 为什么你设置了标签“nullpointerexception”,但在标题中却写了IllegalArgumentException?请显示整个堆栈跟踪。
  • @mentallurg 添加。

标签: java exception encryption cryptography illegalargumentexception


【解决方案1】:

这个(或类似的)是引发异常的代码:

public SecretKeySpec(byte[] key, String algorithm) {
    if (key == null || algorithm == null) {
        throw new IllegalArgumentException("Missing argument");
    }
    if (key.length == 0) {
        throw new IllegalArgumentException("Empty key");
    }
    this.key = key.clone();
    this.algorithm = algorithm;
}

请注意,当key 数组的长度为零时会引发异常。实际上,这是唯一的情况SecretKeySpec 构造函数将抛出此异常并显示此消息1。所以没有任何空间让任何怀疑这就是你的代码正在做的事情。

解决方案:修复调用 encryptWithAesKey 的代码,使其不会传入零长度字节数组。


1 - 这适用于 Sun / Oracle / OpenJDK 代码库。我发现的SecretKeySpec 构造函数的Android 实现为此使用了不同的消息:“key.length == 0”。看来,在较新版本的 Android 中,他们必须将行为更改为更符合 Java(tm)。或者,不知何故,您的 Android 平台正在使用基于 OpenJDK 的加密实现。


byte[]键是[B@b8979fb,我查过了。

这并不能证明字节数组的长度不为零。请阅读:Why do I get garbage values when print arrays in Java?

简而言之,[B@b8979fb 告诉您它是一个非空字节数组,但绝对没有关于它的长度或内容。

这会返回异常,但在 Android 28 更低版本中运行良好。

在 Android 案例中,您必须提供一个非空字节数组。如果您提供一个空字节数组作为键,Android 版本也会失败(相同的异常,不同的消息)。

【讨论】:

  • 谢谢你,现在就开始吧!长度绝对为零。
  • 我唯一不明白的是为什么它适用于其他版本的Android?
猜你喜欢
  • 2013-04-29
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多