I
Ishikawa
Всем бобра!
Сегодня продолжим разрабатывать нашу программу для шифрования файлов, начатую в первой части и допишем метод шифрования DEAD5EC. Этот метод реализует шифрование файла, его упаковку/распаковку через библиотеку Gzip. Упаковка нужна, т.к. файлы в несжатом виде получаются большого объема.
Сама структура приложения не изменилась, разве что добавились нужные функции и пара кнопок. Поэтому опишу только нужные функции и покажу их в работе.
Поехали!
Сперва на кнопку вешаем обработчик:
Во время написания функции по кодированию файла я столкнулся с классической задачей "протолкнуть слона через игольное ушко".
Обратите внимание, что опять используется "матрешка" из потоков и выходной файл имеет расширение .crypto
Суть: берем байт и умножаем его на константу, записываем результат и в качестве разделителя используем символ "@". Не зная этой константы, дешифровать обратно теоретически невозможно, т.к. не найдено математического алгоритма факторизации.
Обязательно закрываем поток:
Далее вызываем упаковщик:
1. Упаковываем результат в архив
2. !ВНИМАНИЕ! Исходный файл удаляется
Теперь на вторую кнопку, отвечающую за декодирование, так же вешаем обработчик. Функция которая ее вызывает, сложнее.
(Сообществом StackOverflow в ответ на мою реализацию было написано несколько интересных вариантов, один участник даже провел "исследование" быстродействия)
Для начала нужно распаковать файл, а затем разобрать его по полочкам.
Всё так же используем "матрешку" из потоков. В данном случае удобен оказался BinaryReader.
Далее начинается "магия":
Мы "сканируем" символы и пихаем их в StringBuilder до тех пор, пока не встретим метку @
Если встретили метку, мы достает то, что было в StringBuilder, конвертируем его в Integer и производим операцию, обратную кодировке. В данном случае мы делим на константу-ключ.
И так до тех пор, пока все числа не будут перебраны.
Что же мы получаем в результате кодирования и почему файлы становятся такие большие?
Всё просто. Посмотрите на результат кодирования (взял картинку весом 430Кб):
Заглянем в Gzip архив:
И откроем файл на просмотр:
С декодировкой в этом плане проще. Файл восстанавливается со 100% гарантией и без потерь.
Максимальный размер, который тестировался, 40Гб.
Этот метод можно использовать для очень важных данных. Главное не хранить саму программу-шифровальщик у себя и прятать её.
Для полноты картины приведу коды модуля Gzip. У него только две опции: Compress
и Decompress:
Описывать их не буду, должно быть всё понятно.
На этом всё
И напоминаю, что данная информация представлена исключительно в образовательных целях.
Использование этой информации против закона, этим же законом и карается.
[doublepost=1495693087,1495692703][/doublepost]Исходник выложу чуть позже или сюда или на GitHub
[doublepost=1495751218][/doublepost]Исходник проекта во вложении
[doublepost=1496292803][/doublepost]И никто даже не спросил, почему метод называется DEAD5EC ? DE AD 5 EC
Может даже это:
или
На самом деле вместо разделителя @ предполагалось использовать метку DEADSEC (aka WatchDogs), но это негативно влияло на размер выходного файла.
[doublepost=1496293307][/doublepost]Ссылка на GitHub: https://github.com/ishikawakaoru/CryptoNote
Сегодня продолжим разрабатывать нашу программу для шифрования файлов, начатую в первой части и допишем метод шифрования DEAD5EC. Этот метод реализует шифрование файла, его упаковку/распаковку через библиотеку Gzip. Упаковка нужна, т.к. файлы в несжатом виде получаются большого объема.
Сама структура приложения не изменилась, разве что добавились нужные функции и пара кнопок. Поэтому опишу только нужные функции и покажу их в работе.
Поехали!
Сперва на кнопку вешаем обработчик:
Во время написания функции по кодированию файла я столкнулся с классической задачей "протолкнуть слона через игольное ушко".
Обратите внимание, что опять используется "матрешка" из потоков и выходной файл имеет расширение .crypto
Суть: берем байт и умножаем его на константу, записываем результат и в качестве разделителя используем символ "@". Не зная этой константы, дешифровать обратно теоретически невозможно, т.к. не найдено математического алгоритма факторизации.
Обязательно закрываем поток:
Далее вызываем упаковщик:
1. Упаковываем результат в архив
2. !ВНИМАНИЕ! Исходный файл удаляется
Теперь на вторую кнопку, отвечающую за декодирование, так же вешаем обработчик. Функция которая ее вызывает, сложнее.
(Сообществом StackOverflow в ответ на мою реализацию было написано несколько интересных вариантов, один участник даже провел "исследование" быстродействия)
Для начала нужно распаковать файл, а затем разобрать его по полочкам.
Всё так же используем "матрешку" из потоков. В данном случае удобен оказался BinaryReader.
Далее начинается "магия":
Мы "сканируем" символы и пихаем их в StringBuilder до тех пор, пока не встретим метку @
Если встретили метку, мы достает то, что было в StringBuilder, конвертируем его в Integer и производим операцию, обратную кодировке. В данном случае мы делим на константу-ключ.
И так до тех пор, пока все числа не будут перебраны.
Что же мы получаем в результате кодирования и почему файлы становятся такие большие?
Всё просто. Посмотрите на результат кодирования (взял картинку весом 430Кб):
Заглянем в Gzip архив:
И откроем файл на просмотр:
С декодировкой в этом плане проще. Файл восстанавливается со 100% гарантией и без потерь.
Максимальный размер, который тестировался, 40Гб.
Этот метод можно использовать для очень важных данных. Главное не хранить саму программу-шифровальщик у себя и прятать её.
Для полноты картины приведу коды модуля Gzip. У него только две опции: Compress
и Decompress:
Описывать их не буду, должно быть всё понятно.
На этом всё
И напоминаю, что данная информация представлена исключительно в образовательных целях.
Использование этой информации против закона, этим же законом и карается.
[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