2016-12-13 20 views
1

Как сохранить в файле зашифрованный текст и IV (из режима блочного шифрования, например AES-GCM)? Если я отделяю их байтом, соответствующим символу «:», то при чтении мне придется преобразовать весь массив байтов в String, а затем разбить строки на куски, разделенные «:», а затем снова преобразовать куски в байт массивы. Есть ли более простой способ? Может быть, байт, который мы уверены, не может появиться в результате шифрования 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(); 
+0

@SibeeshVenu Я отредактировал мой вопрос. –

ответ

1

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

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

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

+0

Мой код был первой попыткой использовать AES-GCM. В моих последующих кодах я сохранил IV в отдельном столбце таблицы, принадлежащей БД. В любом случае спасибо за ваш ответ и да, у меня были некоторые проблемы с кодированием и декодированием необработанных байтов, которые я решил использовать с кодировкой ISO-8859-1, когда я получаю байты из String и когда инициализирую String из необработанных байтов. Он работает нормально, но мне интересно узнать, является ли это хорошим решением. –

+0

Хранение IV в отдельном столбце действительно не требуется и может привести к сбоям в синхронизации, что повлияет на возможность восстановления шифрованного текста. Есть ли конкретная причина, по которой вы используете ISO-8859-1 вместо UTF-8? Если это так, все в порядке, но если у вас нет причины, вы, вероятно, захотите использовать UTF - для сообщений открытого текста. Для шифрованного текста вы хотите кодировать это с шестнадцатеричным или Base64 перед сохранением. ISO-8859-1 и UTF-8 используют 8 бит на каждый байт (в отличие от ASCII, который равен 7), но не гарантируют, что все возможные кодовые точки являются допустимыми символами. Base64 делает. – Andy

+0

Почему хранение IV отдельно может синхронизировать поля? Я не использую UTF-8, потому что использую его - и я не знаю, почему, - моя схема шифрования не работает, в то время как - и это, конечно, странно - она ​​работает без каких-либо проблем с ISO-8859-1. Можете ли вы объяснить, почему зашифрованный текст и открытый текст должны использовать разные кодировки? –