Получение InvalidKeyException при расшифровке с использованием закрытого ключа - PullRequest
1 голос
/ 09 октября 2019

Я пытаюсь зашифровать и расшифровать данные после генерации пары открытый-закрытый ключ в хранилище ключей Android. Почему-то происходит сбой во время расшифровки.

Я использую алгоритм RSA / ECB / OAEPWithSHA-256AndMGF1Padding.

Ниже приведен мой код

public void RSAEncryptDecryptTest() {
        String plain = "SampleData";
        try {
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", ANDROID_KEY_STORE);
            AlgorithmParameterSpec spec;

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                // Below Android M, use the KeyPairGeneratorSpec.Builder.

                spec = new KeyPairGeneratorSpec.Builder(mApplicationContext)
                        // You'll use the alias later to retrieve the key.  It's a key for the key!
                        .setAlias(plain)
                        .build();
            } else {
            // On Android M or above, use the KeyGenparameterSpec.Builder and specify permitted
            // properties  and restrictions of the key.
            spec = new KeyGenParameterSpec.Builder(plain, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT
                    | KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
                    /*.setKeySize(VisaSCPConstants.ALGORITHM_KEY_SIZE)*/
                    .setAlgorithmParameterSpec(new RSAKeyGenParameterSpec(VisaSCPConstants.ALGORITHM_KEY_SIZE, RSAKeyGenParameterSpec.F4))
                    .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
                    .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                    .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA1, KeyProperties.DIGEST_SHA512)
                    .setUserAuthenticationRequired(false)
                    .build();
            }

            kpg.initialize(spec);
            KeyPair kp = kpg.genKeyPair();
            PublicKey publicKey = kp.getPublic();
            PrivateKey privateKey = kp.getPrivate();

            Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] encryptedBytes = cipher.doFinal(plain.getBytes());
            System.out.println("Encrypted = " + Base64.encodeToString(encryptedBytes, Base64.NO_WRAP));

            cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte [] decryptedBytes = cipher.doFinal(encryptedBytes);
            if(plain.equals(new String(decryptedBytes))) {
                System.out.println("TRUE");
            } else {
                System.out.println("FALSE");
            }
        } catch (Exception e) {
            System.out.println("Exception " +e);
        }
    }

Ниже приведено исключение I

InvalidKeyException - ни один провайдер не предлагает [RSA, ECB, OAEPWithSHA1AndMGF1Padding] для ключа RSA класса android.security.keystore.AndroidKeyStoreRSAPrivateKey и формат экспорта null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...