java - 在 Android 上,为什么我在尝试加密时出现 javax.crypto.IllegalBlockSizeException?
问题描述
我生成的密钥如下:
val spec = KeyGenParameterSpec.Builder(keyAlias, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setRandomizedEncryptionRequired(true)
.build()
val generator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, keyStoreAlias)
generator.init(spec)
return generator.generateKey()
我得到这样的 SecretKey:
val keyStore = KeyStore.getInstance(keyStoreAlias)
keyStore.load(null)
return keystore.getKey(keyAlias, null) as SecretKey
并加密方法如下:
fun encrypt(data: String): ByteArray {
val aesCipher = Cipher.getInstance(encryptionAlgorithm)
aesCipher.init(Cipher.ENCRYPT_MODE, getSecretKey())
val iv = aesCipher.iv
val dataAsByteArray = data.toByteArray(Charsets.UTF_8)
return aesCipher.doFinal(dataAsByteArray)
}
加密算法声明为:
private val encryptionAlgorithm = "AES/GCM/NoPadding"
我在 API 27 模拟器上运行它。问题是我为什么会得到:
2019-11-15 01:28:59.045 31896-32044/com.compass.compass.beta W/System.err: javax.crypto.IllegalBlockSizeException
2019-11-15 01:28:59.046 31896-32044/com.compass.compass.beta W/System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:519)
2019-11-15 01:28:59.046 31896-32044/com.compass.compass.beta W/System.err: at javax.crypto.Cipher.doFinal(Cipher.java:1741)
....
2019-11-15 01:28:59.047 31896-32044/com.compass.compass.beta W/System.err: Caused by: android.security.KeyStoreException: Unknown error
2019-11-15 01:28:59.047 31896-32044/com.compass.compass.beta W/System.err: at android.security.KeyStore.getKeyStoreException(KeyStore.java:697)
2019-11-15 01:28:59.047 31896-32044/com.compass.compass.beta W/System.err: at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.update(KeyStoreCryptoOperationChunkedStreamer.java:132)
2019-11-15 01:28:59.047 31896-32044/com.compass.compass.beta W/System.err: at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:217)
2019-11-15 01:28:59.047 31896-32044/com.compass.compass.beta W/System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:506)
到目前为止,我发现的其他答案都没有帮助。我试图彻底阅读文档,但我只是不明白这里有什么问题。令人惊讶的是,所有关于此的单元测试都通过了。这些问题仅出现在仿真器和实际设备中。
编辑更多信息: 我在 android API 29 和 API 27 上尝试了同样的事情,这似乎只发生在 API 27 上,但在 API 29 上。
解决方案
推荐阅读
- python - 如何杀死异步协程(不是 First_completed 案例)
- docker - 无法从容器默认路由 172.17.0.1 内部 ping
- java - Retrofit and Volley——同步和异步请求
- java - 拆分 toString 的返回值的值
- php - 左连接多态关系 Laravel
- typescript - 在带有类的 TS 中使用开放式参数
- python - Round To 1dp 给出错误的数字
- android - Flutter 应用程序无法运行,显示 Gradle 任务 assemble Debug failed with exit code -1
- javascript - 在对象中创建一个具有不同数组元素的新数组
- php - 在 Shopify PHP 应用程序中上传产品图片作为附件