#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. Я также обновил код шифрования. Пожалуйста, помогите.