Трунов Д.Н.
Копия статьи, опубликованной 15.08.2016 на сайте https://sites.google.com/site/publicworkstrunov
КОМПЬЮТЕРНАЯ ПРОГРАММА EJOURNAL ДЛЯ ВЕДЕНИЯ ЭЛЕКТРОННЫХ ЖУРНАЛОВ СПЕЦИАЛЬНОГО ФОРМАТА
Копия статьи, опубликованной 15.08.2016 на сайте https://sites.google.com/site/publicworkstrunov
Введение
EJournal – компьютерная программа, предназначенная для ведения электронных журналов и дневников в формате, который предполагает просмотр и добавление записей без возможности их последующего удаления или исправления. Целостность журнала в целом и каждой записи в отдельности обеспечивается за счёт применения механизмов, включающих в себя криптографическое преобразование [1, 2], хэш-функции [2, 3] и контрольные суммы [4]. Комплексная система внутренних цифровых подписей, основанных на этих механизмах, позволяет контролировать отсутствие искажений не только в отдельной записи, но в и структуре журнала, предотвращая возможность несанкционированной замены записей, удаления, добавления ложных записей и т.д.
Подобная форма ведения журналов может позволить перевести в электронный вид все виды документов, правилами ведения которых допускается добавление новой информации, но запрещается исправление или изменение ранее добавленной. То есть те виды документов, в которых каждая запись имеет значение, независимо от общего количества записей. Примером могут выступить журналы движения денежных средств, трудовые книжки, медицинские карточки, судовые журналы, журналы регистрации, дневники наблюдений и прочее.
Нельзя сказать, что в таких документах вообще невозможны исправления, но делаются они, чаще всего, внесением двух новых записей: первая отменяет неверную запись, вторая содержит исправленные сведения. Если необходима только отмена ошибочной записи, то достаточно добавить информацию об отмене, причём сами ошибочные записи остаются на месте. На таких принципах и основана работа программы EJournal.
Общая характеристика
Программа EJournal создана для работы под управлением операционных систем семейства Windows, является портативной, то есть не требующей установки, не требовательна к ресурсам и без проблем работает на многих версиях Microsoft Windows (XP/Vista/7/8/10), а также с помощью программы Wine в операционных системах семейства Linux [5]. Программа требует для своего хранения до 2 мегабайт свободного места на жёстком диске (или другом физическом носителе) и до 20 мегабайт оперативной памяти – для работы.
Главное окно программы EJournal (рисунок 1) содержит главное меню (сверху), поле для вывода списка записей журнала (слева), поле для вывода содержимого записи (основное поле), строку указателя номера текущей записи и общего количества записей, а также строку
подписей (внизу).
Окно программы имеет фиксированный размер, поскольку предусмотрен фиксированный размер поля для содержимого записей журнала, который рассчитан на строки текста длиной до 80 символов включительно. Шрифт для отображения текста записей, впрочем, как и другого вида текстов, выбран с фиксированной шириной символов (Courier New или Lucida Console). Кодировка текста записей журнала – ANSI, где 1 символ имеет размер 1 байт.
В возможности программы входят:
- создание нового электронного журнала;
- открытие существующего журнала;
- просмотр записей журнала;
- добавление новой записи;
- поиск записи по номеру (для журналов с большим количеством записей);
- поиск записей по текстовому фрагменту;
- ввод пароля (для открытия журналов, защищённых паролем);
- замена пароля журнала;
- диагностика журнала (проверка на наличие повреждений и их устранение).
Рисунок 1 – Главное окно программы EJournal
Принципы работы программы. Создание журнала и его структура
При создании каждого журнала в начало файла вписывается строка ‘EJOURNAL’+$00, где $00 – код формата журнала (здесь знак $ перед числом означает, что число шестнадцатеричное), а файлу присваивается расширение .jrn. По этим признакам впоследствии проверяется принадлежность файла к электронным журналам, созданным данной программой. Остальное содержимое журнала принадлежит записям.
Каждая запись журнала состоит из следующих элементов:
1) первые четыре байта составляют 32-разрядное целое число – размер записи в байтах;
2) следующие четыре байта составляют 32-разрядное целое число – контрольную сумму текущей записи;
3) после контрольной суммы располагается само тело записи – массив размером от 1 байта до 64 килобайт (именно его размер указан в первом числе);
4) после тела записи располагается 10 символов её подписи.
Под размер записи журнала выделено именно 32-разрядное число (хотя хватило бы и 16-разрядного) для совместимости с возможными будущими форматами, если в них максимальный размер записи превысит 64 килобайта.
При сохранении каждой записи в файл журнала тело записи зашифровывается по алгоритму P-Cry [6]. Формат журнала предусматривает следующие параметры для алгоритма P-Cry: длина ключа 1024 байта, 15 циклов шифрования. Если журнал создаётся без пароля, то шифрование происходит с пустым паролем. Контрольная сумма записи вычисляется во время шифрования и необходима для контроля целостности записи и правильности её последующей расшифровки. В качестве подписи записи выступает криптоподпись (криптографическая подпись), вычисленная по алгоритму CSA-10 [7], длиной 10 символов (CSA-10[10]). Особенностью данного формата журнала является то, что криптоподпись в конце каждой записи подписывает не только свою запись, но и все предыдущие записи вместе с их подписями.
Так, подпись самой первой записи (CSA-10[10] #1) подписывает всю первую запись, кроме самой подписи, включая область размера записи (Size 1), контрольной суммы (Sum 1) и само тело записи (Record 1):
Подпись второй записи (CSA-10[10] #2) подписывает всю первую запись вместе с её криптоподписью (области Size 1, Sum 1, Record 1, CSA-10[10] #1) и вторую запись без области подписи (Size 2, Sum 2, Record 2):
Примечание. Области Record 1 и Record 2 показаны одинаковыми для наглядности. На
самом деле их размеры могут различаться.
Подпись третьей записи (CSA-10[10] #3) подписывает область журнала, включающую первые две записи целиком, а третью запись без подписи и т.д.:
Такая организация подписей позволяет контролировать целостность не только каждой отдельной записи, но и всех предыдущих, а также их взаимное расположение. Кроме того, каждая новая подпись подтверждает достоверность всех предыдущих подписей, что существенно увеличивает надёжность защиты журнала от несанкционированных изменений и допускает заверку только выборочных подписей журнала. Таким образом, наличия зафиксированной и заверенной подписи хотя бы одной последней записи достаточно, чтобы выявить такие изменения в журнале, как:
- исправление внутри любой записи;
- удаление записи из журнала;
- вставка новой записи внутрь журнала;
- перестановка двух или более записей (изменение порядка записей).
Открытие журнала
При открытии журнала программа проверяет в начале файла строку ‘EJOURNAL’+$00 и, в случае успеха, загружает всё содержимое файла (без упомянутой строки) в рабочий массив, имеющий максимальный размер 16 мегабайт (этим и ограничен максимальный размер файла журнала). Если журнал пуст, программа готова только к добавлению записей (то же происходит, когда создаётся новый журнал).
При открытии или создании журнала на основе введённого в программу пароля генерируется ключ шифрования P-Cry. Если пароль не был введён, ключ генерируется на основе пустого пароля. Далее этот ключ не меняется до закрытия программы или пока не будет создан или открыт новый журнал. Следует отметить и то, что введённый пользователем пароль и ключ шифрования P-Cry хранятся отдельно, поэтому если пользователь введёт новый пароль в программу, он будет применён только при следующем создании или открытии журнала.
После загрузки файла в рабочий массив происходит расшифровка и учёт всех записей. Для этого определяется размер первой записи, её контрольная сумма, копируется тело записи во вспомогательный массив и расшифровывается. Также в специальных ячейках памяти помещаются адрес текущей записи в рабочем массиве. Правильность расшифровки определяется по контрольной сумме. Если она совпала, тело записи уже в расшифрованном виде возвращается в рабочий массив на то же место. Если контрольная сумма не совпала, программа сообщает об ошибке шифрования первой записи, что свидетельствует, скорее всего, о неверном пароле, либо о серьёзном повреждении журнала.
Если первая запись не единственная, за ней расшифровываются и проверяются вторая и все остальные записи, сохраняются их адреса (для быстрого поиска), и так до тех пор, пока не будет обнаружен конец журнала. По окончании расшифровки производится вычисление и сохранение в специальной области памяти криптоподписей для каждой записи. Это необходимо для последующей проверки соответствия заявленных подписей (сохранённых в записях) с фактическими (вычисленными для проверки).
Учитывая тот факт, что для вычисления первой криптоподписи нужно задействовать первую запись, для второй – первую и вторую, для третьей – первую, вторую и третью и т.д., одни и те же записи будут постоянно находиться в процессе вычисления и существенно повышать время работы программы. Чтобы этого избежать, в программе EJournal предусмотрен механизм вычисления подписей CSA, при котором каждая запись находится в обработке не более одного раза, независимо от общего количества записей.
После вычисления криптоподписей журнал готов к просмотру. Программа выводит в главном окне полный список записей по их номерам, текст последней записи, под ним выводит информацию о криптоподписях CSA-10[10], над текстом записи её номер и общее количество записей, а в строке заголовка отображается имя файла журнала (рисунок 2). Если кликнуть по номеру любой записи, программа откроет выбранную запись, отобразив в главном окне её номер, текст и подписи. В процессе отображения записи программа проверяет соответствие заявленной и фактической подписей открытой записи и, в случае обнаружения несоответствия, выдаёт сообщение об ошибке.
Рисунок 2 – Окно программы с открытым журналом
Следует обратить внимание, что программа нумерует записи в журнале, начиная с 0, поэтому, если в журнале N записей, нумеруются они от 0 до N-1. В то же время, для удобства пользователя, он видит номера записей от 1 до N, а программа автоматически преобразовывает номера записей в процессе обращения к ним. Так, если пользователь просит открыть первую запись, то фактически программа откроет нулевую. Исключение составляют функции поиска, которые возвращают номера записей, начиная с 1. Если такая функция возвращает ноль, значит, ничего найти не удалось.
Добавление записи в журнал
Текст для новой записи набирается и редактируется в специальном окне (рисунок 3), которое можно открыть из главного меню программы. При этом в первой строке новой записи сразу расположен номер добавляемой записи, текущие дата и время. При необходимости эту информацию можно заменить или удалить. Редактировать текст можно до того, как он будет добавлен в журнал. После добавления записи к ней будет прикреплена криптоподпись, а редактирование будет запрещено.
Рисунок 3 – Окно добавления новой записи
Программа EJournal не сохраняет весь журнал целиком, а именно – дописывает в файл новые записи по мере их добавления. Одновременно с добавлением в файл, новая запись добавляется также и в рабочий массив, увеличивается общий счётчик записей, сохраняется её адрес в рабочем массиве и криптоподпись. Далее программа ведёт себя так, будто журнал изначально был открыт с новой записью.
Учитывая такую особенность ведения журнала, прежде чем выдать отчёт об успешном добавлении записи в файл, программа выполняет ряд проверок, чтобы исключить появление критической ошибки и повреждения журнала. Алгоритм добавления записи включает в себя следующие шаги:
1. Текст записи помещается во вспомогательный массив размером до 64 килобайт.
2. Проверяется допустимость размера новой записи и наличия достаточного количества свободного места в рабочем массиве для неё.
3. Производится шифрование тела новой записи по алгоритму P-Cry.
4. Проверяется целостность ключа шифрования P-Cry. Если в процессе работы программы ключ шифрования по каким-то причинам был повреждён, добавлять запись нельзя, иначе расшифровать её будет уже невозможно.
5. Проверяется правильность шифрования путём контрольной расшифровки тела записи и сравнения контрольных сумм.
6. К записи добавляется её размер, контрольная сумма, криптоподпись CSA. Вся эта информация вместе с зашифрованной записью дописывается в файл журнала.
7. В случае успеха всех предыдущих операций обновляется информация в памяти программы: добавляется запись в рабочий массив, меняется счётчик количества записей, добавляется адрес новой записи и её криптоподпись.
Только в случае успешного выполнения последнего пункта запись считается успешно добавленной в журнал. Если на каком-то этапе будет допущена ошибка, программа выдаст соответствующее уведомление.
Диагностика журнала
Одна из самых неприятных ошибок, которая может произойти при работе с журналом, это сбой во время записи файла. Во многих программах, прежде чем производить запись в файл, создаётся его копия. В EJournal при добавлении записи подвергается риску ошибки только сама эта запись, поэтому копирование всего журнала не предусмотрено. Вместо этого существует функция диагностики, позволяющая выявлять и устранять ошибки в журнале.
При выполнении диагностики программа вначале открывает диагностируемый журнал обычным способом и определяет код и место ошибки. Если ошибки нет, ничего не происходит. Если ошибка есть и её невозможно устранить, программа просто сообщает об этом. Например, если диагностируется журнал, защищённый паролем, а пароль неизвестен, то эту ошибку тоже нельзя устранить.
К устранимым ошибкам относятся:
- ошибка расшифровки записи при верном пароле;
- ошибка проверки криптоподписи файла;
- размер последней записи указан больше, чем он есть на самом деле.
В случае выявления любой из этих ошибок при диагностике будет создана копия файла, после чего все записи, начиная с первой повреждённой, будут удалены из журнала. Хотя в обычных условиях удаление записей не предусмотрено, при диагностике это допустимо. Восстановить эти записи можно только из резервной копии журнала, если таковая была создана пользователем заранее. Если же была удалена только последняя запись после неудачного её сохранения в файл, можно повторить попытку её добавления после выполнения диагностики.
Другие функции программы
Из нерассмотренных функций остались функции поиска по записям, ввод и замена пароля журнала. Рассмотрим кратко эти функции.
Поиск записей делится на два типа: поиск по строке (или просто поиск) и поиск по номеру. Поиск по номеру предусматривает переход к записи, номер которой будет введён в окне поиска (рисунок 4). Эта функция может быть полезной при работе с журналами, содержащими большое количество записей. В остальных случаях достаточно пользоваться и обычным списком записей.
Поиск по строке предусматривает поиск записей, содержащих текстовый фрагмент, введённый в строке поиска (рисунок 5). В случае нахождения таких записей, их номера помещаются в интерактивный список (если кликнуть по номеру записи в этом списке, она откроется в главном окне).
Рисунок 4 – Окно поиска по номеру
Рисунок 5 – Окно поиска по строке
Пароль в программу вводится для защиты содержимого журналов от несанкционированного к ним доступа. Как уже упоминалось ранее, все журналы сохраняются на диск в зашифрованном виде, а ключ шифрования генерируется на основе введённого пароля (или пустого пароля по умолчанию). После ввода пароль хранится в специальной ячейке памяти (точнее, в двух) и не влияет на работу программы, пока не понадобится создать или открыть новый журнал. Если нужно только открыть журнал, пароль достаточно ввести всего один раз в соответствующей строке окна «Пароль» (рисунок 6). Если предполагается создание журнала, пароль нужно ввести дважды. Оба пароля будут храниться в специальных ячейках до тех пор, пока в них не возникнет потребность. Пароли можно очистить, нажав кнопку «Сбросить».
Рисунок 6 – Окно ввода пароля
Если возникнет необходимость заменить пароль на открытом журнале, это можно сделать в окне «Параметры журнала» (рисунок 7), в котором также располагается и кнопка «Диагностика». Для этого нужно ввести текущий пароль, затем новый пароль и повторить новый пароль (для надёжности). Если журнал был без пароля, текущий следует оставлять пустым. Если текущий пароль будет введён неправильно или будет отличаться новый пароль и его повторение, программа сообщит об ошибке и отклонит замену.
Следует заметить, что при замене пароля журнала введённый в программу пароль остаётся неизменным, поэтому при открытии или создании нового журнала будет действовать тот пароль, который был введён в программу до процедуры замены (или пустой по умолчанию). Если в дальнейшем предполагается работать с новым паролем в других журналах, новый пароль необходимо ввести дополнительно в окне ввода пароля.
Рисунок 7 – Окно параметров журнала
Рекомендации по ведению журналов
Программа EJournal сохраняет журнал в единственном экземпляре, поэтому пользователю рекомендуется время от времени делать его резервную копию. Если записи добавляются часто, копию можно делать после добавления серии записей, если же записи добавляются редко, создавать копию можно после каждого добавления записи. Чем более ценная в журнале информация, тем важнее наличие её резервной копии.
Если в процессе добавления записи в журнал произойдёт ошибка, о чём сообщит программа, следует запустить диагностику журнала, которая удалит повреждённую запись. После этого можно повторить попытку добавления записи. Если ошибку не устранить, возможность добавления новых записей в журнал будет заблокирована.
Особенности программы и формата журналов, такие как запрет редактирования, применение шифрования и криптографических подписей, препятствуют случайному искажению содержимого журнала (кроме случаев физического повреждения или удаления). Однако, чтобы исключить возможность целенаправленной подделки журнала, необходимо регулярно фиксировать криптоподписи вновь добавляемых записей и время от времени проверять их. Один из способов фиксации подписей – занесение их в таблицу, как в примере ниже:
Если помимо контроля целостности необходимо ещё и подтверждение авторства журнала, необходимо заверить хотя бы одну (последнюю) криптоподпись журнала традиционными методами, например, поставив под ней собственноручную подпись. Чем больше криптоподписей журнала заверено, тем больше уверенность в отсутствии искажений.
В качестве записей журнала выступает текстовая информация относительно небольшого объёма. Если же объём информации превышает допустимые 64 килобайта или содержит не только простой текст, то следует определить, нужно ли вообще добавлять такую информацию в журнал и для чего. Если необходимость в этом всё же существует, возможно, следует сохранить эту информацию в отдельный файл и добавить в журнал его описание и криптоподпись.
Установленный на журнале пароль вместе с алгоритмом шифрования P-Cry достаточно надёжно защищает от нежелательного доступа к содержимому журнала. Если же предполагается открыть доступ к защищённому паролем журналу, нужно просто заменить этот пароль пустым. Смена паролей не влияет на структуру журнала или криптоподписи.
Заключительные положения
Применение журналов рассмотренного формата позволяет избежать следующих проблем:
1. Электронный документ подписан электронной цифровой подписью. Возникла необходимость добавить в документ информацию без изменения прежнего содержимого. Для этого нужно удалить электронную подпись, добавить информацию и вновь поставить подпись. При этом нет гарантий, что ранее внесённые сведения не были изменены случайно или намеренно.
2. Первую проблему можно решить, сохранив и первоначальный документ, и его изменённую версию, однако при большом количестве изменений необходимо будет хранить слишком большое количество копий одного и того же документа.
3. Ещё один вариант решения проблемы 1 – внести дополнения к первоначальному документу в отдельном документе. Но при большом количестве таких дополнений работать с ними не очень удобно.
Программа EJournal запрещает изменения ранее внесённых в документ (журнал) сведений, сохраняет действующими все вычисленные электронные подписи, допускает добавление новых сведений и всё это – в одном файле. И хотя это не отрицает возможности существования других форматов журналов, отличающихся по структуре записей, алгоритмам шифрования и вычисления криптоподписей, формат EJournal достаточно универсален и подходит для решения довольно широкого круга задач.
Источники информации
1. Википедия. Электронная подпись [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Электронная_подпись
2. Сергей Баричев. Криптография без секретов [Электронный ресурс]. Режим доступа: http://www.bnti.ru/dbtexts/ipks/old/analmat/1_2002/crypto4.pdf
3. Википедия. Хеширование [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Хеширование
4. Википедия. Контрольная сумма [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Контрольная_сумма
5. Википедия. Wine [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Wine
6. Трунов Д.Н. Краткое описание алгоритмов шифрования ESCK-3, ESCK-4, P-Cry и DME-1 [Электронный ресурс]. Режим доступа: https://sites.google.com/site/publicworkstrunov
7. Трунов Д.Н. Особенности и характеристики алгоритмов вычисления криптоподписей CSA-10, CSA-100, CSA-1000 и CSA-10000 [Электронный ресурс]. Режим доступа: https://sites.google.com/site/publicworkstrunov
Комментариев нет:
Отправить комментарий