java.lang.IllegalArgumentException:空键
java.lang.IllegalArgumentException: Empty key
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.run(MessageQueueThreadImpl.java:226)
System.err: at java.lang.Thread.run(Thread.java:919)
这个(或类似的)是抛出异常的代码:
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[] key is [B@b8979fb, I checked it.
这并不能证明字节数组的长度不为零。请阅读:Why do I get garbage values when print arrays in Java?
简而言之,[B@b8979fb
告诉你它是一个非空字节数组,但绝对没有关于它的长度或内容。
This is returning an exception but works well in Android 28 lower.
在 Android 的情况下,您必须提供一个非空字节数组。如果您提供空字节数组作为键,Android 版本也会失败(同样的异常,不同的消息)。
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.run(MessageQueueThreadImpl.java:226)
System.err: at java.lang.Thread.run(Thread.java:919)
这个(或类似的)是抛出异常的代码:
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[] key is [B@b8979fb, I checked it.
这并不能证明字节数组的长度不为零。请阅读:Why do I get garbage values when print arrays in Java?
简而言之,[B@b8979fb
告诉你它是一个非空字节数组,但绝对没有关于它的长度或内容。
This is returning an exception but works well in Android 28 lower.
在 Android 的情况下,您必须提供一个非空字节数组。如果您提供空字节数组作为键,Android 版本也会失败(同样的异常,不同的消息)。