使用 RSA-OAEP 和 Android 密钥库解密消息:IllegalBlockSizeException

Decrypting message with RSA-OAEP and Android Keystore: IllegalBlockSizeException

我在 try 块中有以下代码,它应该生成 RSA public/private 密钥对,使用 public 密钥加密消息并使用私钥再次解密:

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
         KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(
                 "key1",
                 KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
                 .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                 .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
                 .build());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
byte[] src = "hello world".getBytes();

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] cipherData = cipher.doFinal(src);

Cipher cipher2 = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher2.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] msg = cipher2.doFinal(cipherData);

主要取自here and here

最后一行抛出 javax.crypto.IllegalBlockSizeException 类型的异常,没有 message/further 详细信息。异常前logcat中的三行是

 E keymaster1_device: Finish send cmd failed
 E keymaster1_device: ret: 0
 E keymaster1_device: resp->status: -1000

以防万一。

有没有人知道可能出了什么问题?

使用minSdkVersion 23

编辑: 我刚刚意识到,如果我使用 PKCS#1 v1.5 填充,它就可以工作。这对我现在有帮助,但我仍然想尝试让它与 OAEP 一起工作。

加密时需要将算法参数spec放入cipher中

if (algorithmParameterSpec != null) {
            encrypter.init(Cipher.ENCRYPT_MODE, getKey(), algorithmParameterSpec)
        }

algorithmParameterSpec 是

OAEPParameterSpec("SHA-256",
                    "MGF1",
                    MGF1ParameterSpec.SHA256,
                    PSource.PSpecified.DEFAULT)