Я пытаюсь добавить свой 16-битный IV, используемый для шифрования моих данных в качестве последнего блока в массиве байтов, используемом для хранения зашифрованных данных. Я хочу сделать это, очевидно, для части расшифровки, чтобы я мог использовать абсолютно случайный IV для каждого вызова шифрования/дешифрования. У меня есть следующие для испытательных целей:Добавление IV в зашифрованный массив байтов в качестве окончательного блока
public static String encrypt(String plainText) throws Exception {
encryptionKey = new SecretKeySpec(eKey.getBytes("UTF-8"), "AES");
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, initialisationVector);
byte[] eDataAndIv = appendIvToEncryptedData(cipher.doFinal(plainText.getBytes("UTF-8")), initialisationVector.getIV());
return bytesToHexString(eDataAndIv);
}
public static String decrypt(String hexEncoded) throws Exception {
byte[] decodedBytes = hexStringToBytes(hexEncoded);
ArrayList<byte[]> al = retreiveIvFromByteArray(decodedBytes);
byte[] eData = al.get(0);
byte[] iv = al.get(1);
cipher.init(Cipher.DECRYPT_MODE, encryptionKey, new IvParameterSpec(iv));
return reconstructedPlainText(cipher.doFinal(eData));
}
private static byte[] appendIvToEncryptedData(byte[] eData, byte[] iv) throws Exception {
ByteArrayOutputStream os = new ByteArrayOutputStream();
os.write(eData);
os.write(iv);
return os.toByteArray();
}
private static ArrayList<byte[]> retreiveIvFromByteArray(byte[] dataPlusIv) {
ByteArrayOutputStream iv = new ByteArrayOutputStream(16);
ByteArrayOutputStream eData = new ByteArrayOutputStream();
iv.write(dataPlusIv, dataPlusIv.length - 16, 16);
eData.write(dataPlusIv, 0, dataPlusIv.length - 16);
ArrayList<byte[]> al = new ArrayList<byte[]>();
al.add(eData.toByteArray());
al.add(iv.toByteArray());
return al;
}
Список шагов для шифрования являются:
- Создать IV
- Шифрование данных
- Append IV к концу зашифрованного массива байт данных
- Кодирование байтовой матрицы с использованием шестнадцатеричного
Список шагов для дешифрования:
- Decode шестигранных
- Перерыва зашифрованных данные и IV из массива байт
- данных Расшифровать с использованием IV
Что я имею дело, но я думаю, что Я хочу знать, есть ли «лучший» способ сделать это? Под этим я подразумеваю, есть ли набор или более простой способ сделать это, используя типы Cipher*
? Я не могу их найти.
Спасибо.
, добавив IV в зашифрованную строку, вы побеждаете всю ее цель - атака может просто игнорировать последние X символов/байтов –