Хранилище ключей Android с проблемой предоставления больших данных, мы используем AES / GCM / NoPadding.После определенного диапазона его выбрасывание исключения

#android #encryption #cryptography #aes #android-keystore

#Android #шифрование #криптография #aes #android-хранилище ключей

Вопрос:

Я сталкиваюсь с проблемами при использовании AES / GCM / NoPadding, после определенного диапазона он выбрасывает исключение и не шифрует после диапазона 65536.У меня длина текста 131072, но шифрование выполняется только до 65536.

 even tried the following as well,
AES/GCM/NoPadding
AES/CBC/pkcs7padding.but after a particular range it is throwing invalidexception.
  
**Note:** 
If I use BouncyCastle provider it is working fine(encryption is happening). But when I use Android keystore with keyspec is not working.
 

даже попробовал следующее,
AES / GCM / NoPadding
AES / CBC / pkcs7padding.но после определенного диапазона он выдает исключение invalidexception.

код:

общедоступный статический EncryptCallBack encryptText (последний байт [] textToEncrypt)

         throws UnrecoverableEntryException, NoSuchAlgorithmException, KeyStoreException,

        NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IOException,

        InvalidAlgorithmParameterException, SignatureException, BadPaddingException,

        IllegalBlockSizeException {
    EncryptCallBack encryptCallBack = new EncryptCallBack();

    final Cipher cipher = Cipher.getInstance(TRANSFORMATION);

    cipher.init(Cipher.ENCRYPT_MODE, getSecretKey());

    /*Cipher update for Large data and Incremental Encryption */
    byte[] encryptedValue = null;

    byte[] input = textToEncrypt;
    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];

    int ctLength = 0;
    try {
        ctLength = cipher.update(input, 0, input.length, cipherText, 0);
        Log.d("Update ciper","Update"  ctLength);

    } catch (ShortBufferException e) {
        e.printStackTrace();
    }

    try {
        ctLength  = cipher.doFinal(cipherText, ctLength);
    } catch (ShortBufferException e) {
        e.printStackTrace();
    }
    encryptedValue = cipherText;

    Log.d("Encrypted data Length","Encyrptedlength :"  encryptedValue.length);

    /*Cipher update for Large data and Incremental Encryption */

    encryptCallBack.setSpecIV(cipher.getIV());
    encryptCallBack.setData(encryptedValue);

    return  encryptCallBack;
}

/*SecertKey*/
 public static SecretKey getSecretKey()  {
        SecretKey key = null;
        try {
            KeyStore keyStore = null;
            try {
                keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
                keyStore.load(null);
            } catch (KeyStoreException | CertificateException |
                    NoSuchAlgorithmException | IOException e) {
            }
           
            if (!keyStore.containsAlias("alias")) {
                KeyGenerator keygen = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE);
                KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder("alias", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                        .build();
                keygen.init(spec);
                key = keygen.generateKey();
            } else {
                KeyStore.SecretKeyEntry keyEntry = (KeyStore.SecretKeyEntry) keyStore.getEntry("alias", null);
                key = keyEntry.getSecretKey();
            }
        } catch (Exception e) {

        }

        return key;
    }

 public static String decryptText(final byte[] encryptedData, byte[] specIV)

            throws UnrecoverableEntryException, NoSuchAlgorithmException, KeyStoreException,

            NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IOException,

            BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {

        final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

        final GCMParameterSpec spec = new GCMParameterSpec(128, specIV);

        cipher.init(Cipher.DECRYPT_MODE, getSecretKey(),spec);

        return new String(cipher.doFinal(encryptedData), "UTF-8");

    }
 

если кто-нибудь столкнется с такой ситуацией. пожалуйста, помогите.

Комментарии:

1. Похоже, вы пытаетесь зашифровать весь зашифрованный текст за один раз, поскольку doFinal() в вашем коде есть только a . Это означает, что вы, вероятно, достигли предела размера массива или аналогичного. Расшифровывайте фрагмент за фрагментом update() и используйте только doFinal() для последнего фрагмента. Очевидно, что куски должны быть меньше 65 тыс.

2. после комментария @rossum. Я попытался зашифровать chuck по частям, шифрование работает, но, когда я попытался расшифровать, он выдал javax.crypto. Исключение AEADBadTagException. Я также обновил код шифрования. Пожалуйста, помогите.