при шифровании с использованием ключа 256 AES CBC большие текстовые данные нарушаются - PullRequest
0 голосов
/ 27 сентября 2018

в моем приложении для Android я использую режим AES CBC с размером ключа 256, я использовал этот алгоритм для хранения пароля и некоторых данных в виде строки в формате json, чтобы потом можно было разобрать его на обычном объекте, и все было хорошо, но когда япопробуйте зашифровать объект, который имеет byte [] размером> 300 Кбайт, что-то не так происходит, потому что позже, когда я расшифровываю эти данные, они намного меньше оригинальных, и у меня появляются некоторые странные данные в середине расшифрованной строки, которые позже вызывают Exception, когдапытаясь разобрать его с JSON на объект.Я использую Android Key store для хранения моего ключа шифрования / дешифрования.

public String encrypt(SecretKey key, String data, String transformation) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        mCipher = Cipher.getInstance(transformation);
        mCipher.init(Cipher.ENCRYPT_MODE, key);
        String result = "";

        //get iv from cipher
        byte[] iv = mCipher.getIV();
        //encode to base64 string
        String ivString = Base64.encodeToString(iv, Base64.DEFAULT);
        //add to start of result and add special separator to know later where to cut
        result += ivString+IV_SEPARATOR;

        //encrypt data
        byte[] encryptedData = mCipher.doFinal(data.getBytes());
        //encode to string encrypted data
        String encryptedBase64 = Base64.encodeToString(encryptedData, Base64.DEFAULT);

        //add encrypted data to iv and separator
        result += encryptedBase64;
        return result;
    }

public String decrypt(Key key, String data, String transformation) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {

        //split data by IV_SEPARATOR to get array of iv and encrypted data [iv, encrypted data]
        String[] parts = data.split(IV_SEPARATOR);
        if(parts.length != 2){
            throw new IllegalArgumentException("No IV was found.");
        }
        //decode first part of array to iv byte array
        byte[] iv = Base64.decode(parts[0], Base64.DEFAULT);
        IvParameterSpec spec = new IvParameterSpec(iv);

        //init cipher with required transformation and mode
        mCipher = Cipher.getInstance(transformation);
        mCipher.init(Cipher.DECRYPT_MODE, key, spec);

        //decode data from base64 string to byte array
        byte[] encryptedData = Base64.decode(parts[1], Base64.DEFAULT);
        //decrypt data using cipher
        byte[] decryptedData = mCipher.doFinal(encryptedData);

        //return Base64.encodeToString(decryptedData, Base64.DEFAULT);
        //convert byte array to String and return it;
        return new String(decryptedData);
    }

Функция генератора ключей

@RequiresApi(api = Build.VERSION_CODES.M)
    public void generateAndroidKeyStoreSecretKey(String alias) throws NoSuchProviderException, NoSuchAlgorithmException,
                    InvalidAlgorithmParameterException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE);
        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                        .setKeySize(AES_KEY_SIZE) //key size is 256
                        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                        .setRandomizedEncryptionRequired(true)
                        .build();
        keyGenerator.init(spec);
        keyGenerator.generateKey();
    }

Опять же, когда я шифрую маленький байт [], все хорошо, но когда он большой, он сломанпозже, когда расшифрован.

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