CryptoNote - шифрование файлов. Часть 2

I

Ishikawa

Всем бобра!

Сегодня продолжим разрабатывать нашу программу для шифрования файлов, начатую в первой части и допишем метод шифрования DEAD5EC. Этот метод реализует шифрование файла, его упаковку/распаковку через библиотеку Gzip. Упаковка нужна, т.к. файлы в несжатом виде получаются большого объема.

Сама структура приложения не изменилась, разве что добавились нужные функции и пара кнопок. Поэтому опишу только нужные функции и покажу их в работе.

Поехали!

Сперва на кнопку вешаем обработчик:

upload_2017-5-25_16-39-38.png


Во время написания функции по кодированию файла я столкнулся с классической задачей "протолкнуть слона через игольное ушко".


upload_2017-5-25_16-43-53.png


Обратите внимание, что опять используется "матрешка" из потоков и выходной файл имеет расширение .crypto

upload_2017-5-25_16-44-48.png


Суть: берем байт и умножаем его на константу, записываем результат и в качестве разделителя используем символ "@". Не зная этой константы, дешифровать обратно теоретически невозможно, т.к. не найдено математического алгоритма факторизации.
Обязательно закрываем поток:
upload_2017-5-25_16-49-2.png


Далее вызываем упаковщик:
1. Упаковываем результат в архив
2. !ВНИМАНИЕ! Исходный файл удаляется

upload_2017-5-25_16-49-33.png


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

(Сообществом StackOverflow в ответ на мою реализацию было написано несколько интересных вариантов, один участник даже провел "исследование" быстродействия)

Для начала нужно распаковать файл, а затем разобрать его по полочкам.
upload_2017-5-25_16-53-37.png


Всё так же используем "матрешку" из потоков. В данном случае удобен оказался BinaryReader.

upload_2017-5-25_16-54-31.png


Далее начинается "магия":

upload_2017-5-25_16-55-56.png


Мы "сканируем" символы и пихаем их в StringBuilder до тех пор, пока не встретим метку @
Если встретили метку, мы достает то, что было в StringBuilder, конвертируем его в Integer и производим операцию, обратную кодировке. В данном случае мы делим на константу-ключ.

И так до тех пор, пока все числа не будут перебраны.

Что же мы получаем в результате кодирования и почему файлы становятся такие большие?
Всё просто. Посмотрите на результат кодирования (взял картинку весом 430Кб):

upload_2017-5-25_17-2-11.png


Заглянем в Gzip архив:

upload_2017-5-25_17-2-53.png


И откроем файл на просмотр:

upload_2017-5-25_17-3-23.png


С декодировкой в этом плане проще. Файл восстанавливается со 100% гарантией и без потерь.
Максимальный размер, который тестировался, 40Гб.

Этот метод можно использовать для очень важных данных. Главное не хранить саму программу-шифровальщик у себя и прятать её.

Для полноты картины приведу коды модуля Gzip. У него только две опции: Compress
upload_2017-5-25_17-7-40.png


и Decompress:

upload_2017-5-25_17-8-3.png


Описывать их не буду, должно быть всё понятно.

На этом всё :)

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

Использование этой информации против закона, этим же законом и карается.

[doublepost=1495693087,1495692703][/doublepost]Исходник выложу чуть позже или сюда или на GitHub
[doublepost=1495751218][/doublepost]Исходник проекта во вложении :)
[doublepost=1496292803][/doublepost]И никто даже не спросил, почему метод называется DEAD5EC ? DE AD 5 EC
Может даже это:
Код:
sbc a,0xad   
ld e,(hl)         
ret nz
или
Код:
.byte 0xde         
lods eax,DWORD PTR ds:[rsi]         
pop rsi         
.byte 0xc0

На самом деле вместо разделителя @ предполагалось использовать метку DEADSEC (aka WatchDogs), но это негативно влияло на размер выходного файла.
[doublepost=1496293307][/doublepost]Ссылка на GitHub: https://github.com/ishikawakaoru/CryptoNote
 

Вложения

  • upload_2017-5-25_17-8-47.png
    upload_2017-5-25_17-8-47.png
    6 КБ · Просмотры: 188
  • CryptoNote.rar
    84 КБ · Просмотры: 225
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!