Прерывистое IllegalBlockSizeException при выполнении расшифровки RSA с использованием KeyStore - PullRequest
0 голосов
/ 24 февраля 2019

Ключ RSA генерируется с использованием следующего кода:

RSAKeyGenParameterSpec rsaSpec = new RSAKeyGenParameterSpec(2048, RSAKeyGenParameterSpec.F4);
AlgorithmParameterSpec keyPairGeneratorSpec;

KeyGenParameterSpec.Builder specBuilder = new KeyGenParameterSpec.Builder(keyAlias, KeyProperties.PURPOSE_DECRYPT)
  .setAlgorithmParameterSpec(rsaSpec)
  .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP, KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
  .setDigests(KeyProperties.DIGEST_SHA256);
keyPairGeneratorSpec = specBuilder.build();

try {
  KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA, ANDROID_KEYSTORE);
  keyPairGenerator.initialize(keyPairGeneratorSpec);
  keyPairGenerator.generateKeyPair();
} catch(Exception e) {
  //handle exception
}

И затем он используется для удаленного шифрования на сервере Java с использованием:

Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipher.doFinal(data);

И затем на устройстверасшифровка выполняется следующим образом:

Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsaCipher.init(Cipher.DECRYPT_MODE, key);
return rsaCipher.doFinal(data);

Небольшой процент времени расшифровка происходит успешно, но большую часть времени я получаю это исключение:

javax.crypto.IllegalBlockSizeException
  at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:519)
  ...
Caused by: android.security.KeyStoreException: Unknown error
  at android.security.KeyStore.getKeyStoreException(KeyStore.java:695)
  at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
  at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:506)
  at javax.crypto.Cipher.doFinal(Cipher.java:1736)
  ...

Я нашлаэто исключение в паре других SO-ответов, включая этот: https://stackoverflow.com/a/36020975/6552833, но оно не имеет отношения к делу, поскольку я не использую шифрование OAEP.

...