в моем приложении для 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();
}
Опять же, когда я шифрую маленький байт [], все хорошо, но когда он большой, он сломанпозже, когда расшифрован.