Implementation of 256-bit encryption

WILD

Administrator
Staff member
ADMIN
SELLER
SUPREME
MEMBER
Joined
Jan 21, 2025
Messages
219
Reaction score
633
Deposit
0$
[ЛАЙКИ=5]
Идея шифрования файлов не нова и давно реализована как в автономных программных продуктах (бесплатных и коммерческих), так и в программном обеспечении операционных систем (например, Windows и Linux).

Любой файл можно рассматривать как линейную упорядоченную последовательность байтов.

Каждый байт в файле может принимать только одно из 256 значений (от 0 до 255).
Манипулирование этими байтовыми блоками лежит в основе шифрования файлов, предназначенного для сокрытия их содержимого от посторонних глаз. Возможно, самый простой алгоритм такого шифрования выглядит следующим образом. Программа-кодировщик получает файл и начинает анализировать его байтовую структуру в соответствии со следующим принципом.

Первому считанному байту присваивается число 0, поскольку это первый байт. Затем программа считывает второй байт. Если его значение совпадает с первым, программа переходит к третьему байту, а если отличается, то эта процедура принимает число 1. И так далее. Таким образом, переход программы от байта к байту, проверяя, встречался с текущим значением ранее. В результате этой работы в памяти программы должна быть сформирована таблица соответствия, например, такая:
1774560806981.png
Значения в верхней строке, как ясно следует из концепции алгоритма, не повторяются. Как только таблица поиска заполняется, чтение файла прекращается. Это больше не требуется.

Эта часть алгоритма может быть, и даже предпочтительнее, усложнена путем указания программе читать файл, начиная со случайно выбранного байта. Если программа достигает конца файла, а таблица поиска еще не заполнена полностью, она переходит к началу файла и читает до выбранного байта. Верхняя строка таблицы является ключом. В подавляющем большинстве случаев ее длина составляет 256, хотя она может быть короче, если размер файла чрезвычайно мал (<256 байт) или файл имеет плохой байтовый состав.

Далее программа генерирует ключ, перезаписывая упорядоченный набор из верхней строки таблицы в специализированный файл ключа. После этого начинается собственно шифрование. Программа начинает создавать безликий кодовый файл. Программа считывает первый байт исходного файла и записывает его сначала в кодовый файл, но с новым значением, взятым из таблицы поиска. Все остальные байты записываются в кодовый файл аналогичным образом. Таким образом, байт со значением 249 будет записан в кодовый файл со значением 0, байт со значением 125 будет записан в кодовый файл со значением 1 и так далее. Таким образом, исходный и кодовый файлы всегда равны по размеру. Поскольку закон заполнения таблицы был вероятностным, для любой специализированной программы (проигрывателя, графического редактора, текстового редактора и т. д.) и даже для самой операционной системы результирующий кодовый файл представляет собой бессмысленный набор байтов. Следовательно, для пользователя он также не имеет никакой информационной ценности. Цель шифрования достигнута.

Для восстановления исходного файла из файла и ключа необходимо выполнить повторную операцию. Программа-декодер считывает байты кода файла и переименовывает их в соответствии с загруженным в него ключом. Результатом работы декодера является файл, который по сути является копией файла, зашифрованного программой-кодировщиком. Они решительны до байта. От пользователя требуется лишь присвоить результирующее расширение файла, чтобы операционная система знала, с какими программами его связывать. Расширение явно не включено в ключ, поэтому его необходимо восстановить или записать где-нибудь.
В этом и заключается идея алгоритма. Этот алгоритм легко реализовать, например, на языке программирования Pascal.

Давайте обсудим безопасность этого шифрования. Как известно, идеального метода шифрования не существует. В каждом типе файла есть разделы, где расположение байтов не является вероятностным, а скорее четко определено (поэтому кодировщику лучше начинать чтение файла со случайно выбранного байта). На основе этого хакер может частично или даже полностью восстановить таблицу поиска, а следовательно, и ключ. Незнание расширения файла не является препятствием. Однако попытка взлома шифрования методом перебора будет представлять серьезные трудности, поскольку, согласно одному из правил комбинаторики, существует всего 256! возможных ключей, что является очень большим числом, намного большим, чем 100! 100100. Другой возможный метод взлома — пропустить файл с кодом через кодировщик и использовать полученный ключ для его расшифровки. Однако, простые соображения ясно показывают, что в этом случае результатом всегда будет ключ, в котором значения байтов записаны в порядке 0 1 2 3 … 255, и расшифровка с таким ключом невозможна. Ключ, полученный путем чтения произвольного байта, также не поможет. Хотя он и не будет представлять собой восходящую последовательность от 0 до 255, как в предыдущем случае, отображение байтов в нем все равно будет совершенно отличаться от отображения в исходном ключе.

Ниже представлены основные фрагменты программного кода на языке Delphi (Object Pascal).

процедура AnalysFile;
var z:byte;i,k:word;L:Cardinal;
начинать
Если FSize <= 2, то выйти;
i:=1;
Seek(InputF,FSize-1);
Read(InputF,z);
Bytes:=z;
Шаг:=1;
с помощью MainForm
for L:=FSize-2 downto 0 do begin
Если Stop=true, то выйти;
Seek(InputF,L);
Read(InputF,z);
для k:=1 до i делать
если z=Bytes[k] тогда начать
NewEl:=false;
Перерыв;
end else NewEl:=true;
если NewEl=true, то начать
i:=i+1;
Bytes:=z;
NewEl:=false;
конец;
Шаг:=Шаг+1;
если i=256, то начать
GlobI:=i;Step:=0;Exit;
конец;
конец;
GlobI:=i;Step:=0;
конец;
Генерация ключей.
процедура MakeKey;
var i:byte;
начинать
Если FSize <= 2, то выйти;
Перезаписать(KeyF);
for i:=0 to GlobI-1 do Write(KeyF,Bytes[i+1]);
конец;

Шифрация.
процедура MakeCodeFile;
var z,i:byte;
начинать
Если FSize <= 2, то выйти;
Rewrite(OutputF);
Seek(InputF,0);
с помощью MainForm
while not eof(InputF) do begin
Если Stop=true, то выйти;
Read(InputF,z);
for i:=0 to GlobI-1 do
если z=Bytes[i+1] тогда начать
Write(OutputF,i);
Перерыв;
конец;
Шаг:=Шаг+1;
конец;
Шаг:=0;
конец;

Пояснения к некоторым переменным.

InputF,OutputF,KeyF: файл байта; InputF - входной файл, который будет шифроваться; OutputF -кодовый файл; KeyF – это файл-ключ. На каждой позиции (ячейке) таких файлов будет число типа Байт от 0 до 255.

Байты: массив [1..256] байтов ;

Это массив, в котором будут храниться верхние строки таблицы, соответствующие записи ее ключа и выполнения процедур шифрования.

NewEl:boolean;

Логическая переменная, вызывающая, является очередным считываемым байтом исходного (зашифрованного) файла в зависимости от предыдущих байтов.

GlobI:слово; Шаг:Кардинальный;

Глобальные переменные для обмена информацией между процессами, используя локальные переменные.

Размер: Кардинальный;
Переменная, хранящая объем шифруемого файла в байтах.
Ниже приведен скриншот окна программы-кодера для работы.
1774560892644.png
[/ЛАЙКИ]
 
Top Bottom