Разделитель для зашифрованного текста и других данных

Как сохранить в файле зашифрованный текст и IV (в режиме работы блочного шифра, например, AES-GCM)? Если я разделю их байтом, соответствующим символу ":", при чтении мне придется преобразовать весь массив байтов в строку, а затем разбить строки на куски, разделенные знаком ":", а затем снова преобразовать куски в байт. массивы. Есть ли более простой способ? Может быть, байт, который мы уверены, не может появиться в результате шифрования AES и в векторе инициализации?

Текущий код (в Java) является последующим, но я не уверен, что это лучший способ выполнить то, что я просил, и даже если он работает, потому что я не знаю, может ли байт, представляющий ":", появиться в IV или зашифрованный текст.

FileInputStream keyfis = new FileInputStream("test");
byte[] byteRead = new byte[keyfis.available()];
keyfis.read(byteRead);
keyfis.close();
String textRead=new String(byteRead); 

String[] parts = textRead.split(":");
byte[] encrAESkey=parts[0].getBytes();
byte[] myIV=parts[1].getBytes();
byte[] myencrtext=parts[2].getBytes();

1 ответ

Решение

Традиционно добавляется IV, так как требуется ровно одна длина блока (16 bytes) и режимы блочного шифрования (кроме ECB) требуют IV (или nonce + counter). Тогда ваш код расшифровки просто извлекает первый 16 bytes из ввода зашифрованного текста и использует его в качестве IV, и выполняет операцию дешифрования на оставшихся n - 16 bytes,

Однако вы должны использовать схему кодирования для защиты зашифрованного текста, который вы сериализуете в файл, поскольку вы, скорее всего, столкнетесь с проблемами, если будете писать / читать необработанные двоичные байты. Шестнадцатеричное или Base64 кодирование являются стандартом для этой операции.

Из вашего кода также следует, что вы храните ключ AES вместе с текстом IV и шифром. В то время как IV может храниться без защиты вместе с зашифрованным текстом, ключ не может без эффективного удаления какой-либо защиты, которую обеспечит шифрование.

Другие вопросы по тегам