在Android上,为什么尝试加密时会出现javax.crypto.IllegalBlockSizeException?

时间:2019-11-15 06:46:45

标签: java android encryption

我生成的密钥如下:

    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上发生了。

0 个答案:

没有答案