• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

Доброго времени суток!

Идея давно витала в воздухе, реализацию я написал давно, а разместить статью всё было "не досуг". Исправляемся.

Сегодня я покажу, как на C# написать несложную, но весьма интересную программу для шифрования файлов двумя интересными методами (разработанными в недрах моей головы) - кодировкой HEX (в первой части) и кодировкой DEAD5EC (во второй части)

В основе каждого из методов - факторизация чисел, самый оптимальный метод, ибо "факторизация предположительно является задачей. В настоящее время неизвестно, существует ли не факторизации целых чисел."

HEX-метод прост и быстр, вполне может использоваться в незаконных целях (и используется в популярных нынче вирусов-шифровальщиков-вымогателей), но я вас предупреждаю, что есть УК РФ.
DEAD5EC-метод более упёртый и ресурсоемкий, максимальный размер файла 40Гб. При обработке этим методом размер temp-файла увеличивается в 100 раз (т.е. 40*100=4000Гб), т.к. что аккуратнее.

Итак, поехали!

Методов будет использоваться много, поэтому сначала подключим все пространства имен:

upload_2017-3-21_14-4-3.png



Мы пишем программу-шифратор, но где же Using System.Cryptography? Нету. Он нам не понадобится, ибо мы реализуем свои собственные функции.

В приложении есть собственно две части: оконный интерфейс и собственно код. Начнем с первого, быстренько накидаем интерфейс. Описывать как тащить кнопочки и пр. не буду - это легко.
Главное сделать 4 кнопки, пару полей и два окошка вывода информации для красоты.

Something like this:

upload_2017-3-21_14-6-43.png


Теперь код.
Для начала объявим переменную pathFile за пределами MainWindow(). Она нам нужна для сохранения пути к файлу.

upload_2017-3-21_14-7-21.png


На кнопку "Открыть" вешаем классический обработчик для выбора файла:
upload_2017-3-21_14-9-13.png


Тут для наглядности есть функция DisplayFile. Что она делает? Она разбивает файл на байты и даёт нам на них посмотреть. Практической пользы эта функция не несет.

upload_2017-3-21_14-10-32.png


Тут всё просто, читаем файл и перегоняем его порциями в байты и выводим на экран в отдельном окошке.

Далее, начнем с реализации функций HEX. На кнопку "Кодировать HEX" вешаем обработчик с вызовом функции Copy. Она у нас будет основная.

upload_2017-3-21_14-13-17.png


Теперь собственно разберем функцию Copy. Именно ей предстоит кодировать файл быстро и красиво.

upload_2017-3-21_14-14-32.png


Обращаем внимание на входной параметр bool - именно он определяет, что будет: кодировка или декодировка.
Создаем просторный буфер, создаем классическую обертку FileStream.Read==>FileStream.Write
Первая у нас открывает исходный файл, вторая будет сохранять результат в новый файл.
Готовим массив байтов на bufferSize. Для кодирования HEX используется 18-символьный ключ.
Допускаются только цифры, для чего пишем проверку:
upload_2017-3-21_14-17-13.png


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

Ну а теперь немного магии:

upload_2017-3-21_14-19-38.png


Что мы тут такого натворили? Мы прочитали по-байтово файл, перекодировали ASCII-код в integer
используя конструкцию bytes.Select.ToArray, с помощью bool CoderMode задали режим кодирования.

А потом с каждый int из массива bytesAsInts произвели математическое преобразование используя пару констант и натуральный логарифм. Умножение на "минус единицу" сделано, чтобы результат всегда был положительный.

Возьмем к примеру байт 0x78, который к примеру соответствует букве А.
Мы с ним немного повозились, и 0x78 теперь 0x31 и это уже не буква А . Таким образом мы произвели кодирование, которое в итоге изменяет значение байта, но это не влияет на размер итогового файла.
Если таким способом закодировать pdf или docx - разницы в размере не будет, но программы скажут, что файл возможно поврежден. На самом деле с ним всё ОК, и с помощью декодировки, используя тот же самый 18-символьный ключ, можно восстановить файл обратно со 100% гарантией.

Функция, реализующая обратный процесс:
upload_2017-3-21_14-26-14.png


Все так же, только математически наоборот. На вход этой функции нужно подать зашифрованный HEX-методом файл. (выберите не шифрованный, получите кракозябры).
Обработчик вешается так же:

upload_2017-3-21_14-28-11.png


На этом метод HEX-завершен. Теперь посмотрим, как это работает. Выбираем любой файл, для начала что-нибудь небольшое, вводим ключ и нажимаем "Кодировка HEX". Диалоговых окон пока не предусмотрено, просто смотрим, появился ли файл с расширением .shirase

upload_2017-3-21_14-38-29.png


Обратите внимание - оба файла, и оригинал, и закодированный имеют одинаковый размер.
1 207 870 байт - оригинал
1 207 870 байт - shirase-файл

Теперь проверяем структуру, используя инструмент WinMerge:
upload_2017-3-21_14-40-53.png


Думаю, принцип теперь понятен.

Теперь переименуем оригинальный файл, чтобы его не затереть. Попробуем расшифровать файл shirase. Выбираем его и нажимаем "Декодировать HEX". Рядом окажется оригинальный:
upload_2017-3-21_14-56-50.png


Попробуем его открыть.
upload_2017-3-21_14-57-15.png


Как видим - всё ОК.

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

Как это сделать - я показывать по понятным соображениям тут не буду.

На этом первая часть завершена. Исходник и проект для HEX-метода ниже во вложении.

Метод DEAD5EC более объемный и сложнее - его реализацию пока не прилагаю.
[doublepost=1495692650,1490068995][/doublepost]Исходники чуть позже выложу на GitHub
[doublepost=1496292860][/doublepost]Ссылка на GitHub: GitHub - ishikawakaoru/CryptoNote: Another way to crypting documents based on Factoring Numbers and written on C#
 

Вложения

  • CryptoNote.rar
    55 КБ · Просмотры: 406
A

a113

Отличная статья, спасибо. Вопрос: стоит ли учить С# совместно с Си++, или можно остановиться только на Си++
 

D3coy

One Level
09.03.2020
3
1
BIT
0
Объясните пожалуйста, в чем суть взятия двоичного логарифма от кода в поле, а потом натурального от предыдущего результата? Или это преобразование из головы просто?

Из исходного кода:
int ln = (int)(Math.Log(Math.Log(decodeInt, 2)));
 
Мы в соцсетях:

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