首页 > 解决方案 > 使用 Android KeyStore 进行 AES 解密

问题描述

我正在尝试在 Android KeyStore 中使用 AES 加密 - 密钥生成和加密工作正常,但加密没有。我使用以下代码来生成密钥:

    KeyGenerator keyGenerator = KeyGenerator.getInstance(
                KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
        keyGenerator.init(
                new KeyGenParameterSpec.Builder(keyAlias, keyUsage)
                        .setKeySize(256)
                        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                        .setIsStrongBoxBacked(false)
                        .build());
        keyTeeAES = keyGenerator.generateKey();

以及以下用于加密和解密的代码

 Cipher cipher;

 cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
 cipher.init(Cipher.ENCRYPT_MODE, keyTeeAES);
 cipherCreatedAES = cipher.doFinal(data);

 IvParameterSpec ivParameterSpec = new IvParameterSpec(cipher.getIV());
 cipher.init(Cipher.DECRYPT_MODE, keyTeeAES, ivParameterSpec);
 cipher.doFinal(cipherCreatedAES);

我在解密时遇到以下错误,显然我得到了 NullPointerException

IvParameterSpec ivParameterSpec = new IvParameterSpec(cipher.getIV());

W/System.err: java.lang.NullPointerException: Attempt to get length of null array
    at javax.crypto.spec.IvParameterSpec.<init>(IvParameterSpec.java:53)
    at com.example.securecomputingtest.CryptographyTee.useKeysAES(CryptographyTee.java:347)
    at com.example.securecomputingtest.MainActivity$2.onClick(MainActivity.java:150)
    at android.view.View.performClick(View.java:7259)
    at android.view.View.performClickInternal(View.java:7236)
    at android.view.View.access$3600(View.java:801)
    at android.view.View$PerformClick.run(View.java:27892)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)

我也尝试过为什么我的 AES 加密会引发 InvalidKeyException?- 但也没有工作

标签: androidencryptionaeskeystoreandroid-keystore

解决方案


我现在通过禁用 KeyGenParameterSpec 中的随机加密来解决它

.setRandomizedEncryptionRequired(false)

并设置一个固定的 IV,它现在可以工作了,尽管这个解决方案可能不是最优的。


推荐阅读