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

mat*_*tec 1 android rsa android-keystore

我在一个块内有以下代码,try该代码应该生成 RSA 公钥/私钥对,使用公钥来加密消息并使用私钥再次解密:

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);

Run Code Online (Sandbox Code Playgroud)

大部分取自这里这里

最后一行抛出一个javax.crypto.IllegalBlockSizeException没有消息/进一步详细信息的类型异常。logcat异常之前的三行是

 E keymaster1_device: Finish send cmd failed
 E keymaster1_device: ret: 0
 E keymaster1_device: resp->status: -1000
Run Code Online (Sandbox Code Playgroud)

以防万一这很重要。

有谁知道可能出了什么问题吗?

使用minSdkVersion 23

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

Len*_*Bru 5

加密时需要将算法参数规范放入密码中

if (algorithmParameterSpec != null) {
            encrypter.init(Cipher.ENCRYPT_MODE, getKey(), algorithmParameterSpec)
        }
Run Code Online (Sandbox Code Playgroud)

算法参数规范为

OAEPParameterSpec("SHA-256",
                    "MGF1",
                    MGF1ParameterSpec.SHA256,
                    PSource.PSpecified.DEFAULT)
Run Code Online (Sandbox Code Playgroud)