Доброго времени суток!
Идея давно витала в воздухе, реализацию я написал давно, а разместить статью всё было "не досуг". Исправляемся.
Сегодня я покажу, как на C# написать несложную, но весьма интересную программу для шифрования файлов двумя интересными методами (разработанными в недрах моей головы) - кодировкой HEX (в первой части) и кодировкой DEAD5EC (во второй части)
В основе каждого из методов - факторизация чисел, самый оптимальный метод, ибо "факторизация предположительно является
HEX-метод прост и быстр, вполне может использоваться в незаконных целях (и используется в популярных нынче вирусов-шифровальщиков-вымогателей), но я вас предупреждаю, что есть УК РФ.
DEAD5EC-метод более упёртый и ресурсоемкий, максимальный размер файла 40Гб. При обработке этим методом размер temp-файла увеличивается в 100 раз (т.е. 40*100=4000Гб), т.к. что аккуратнее.
Итак, поехали!
Методов будет использоваться много, поэтому сначала подключим все пространства имен:
Мы пишем программу-шифратор, но где же Using System.Cryptography? Нету. Он нам не понадобится, ибо мы реализуем свои собственные функции.
В приложении есть собственно две части: оконный интерфейс и собственно код. Начнем с первого, быстренько накидаем интерфейс. Описывать как тащить кнопочки и пр. не буду - это легко.
Главное сделать 4 кнопки, пару полей и два окошка вывода информации для красоты.
Something like this:
Теперь код.
Для начала объявим переменную pathFile за пределами MainWindow(). Она нам нужна для сохранения пути к файлу.
На кнопку "Открыть" вешаем классический обработчик для выбора файла:
Тут для наглядности есть функция DisplayFile. Что она делает? Она разбивает файл на байты и даёт нам на них посмотреть. Практической пользы эта функция не несет.
Тут всё просто, читаем файл и перегоняем его порциями в байты и выводим на экран в отдельном окошке.
Далее, начнем с реализации функций HEX. На кнопку "Кодировать HEX" вешаем обработчик с вызовом функции Copy. Она у нас будет основная.
Теперь собственно разберем функцию Copy. Именно ей предстоит кодировать файл быстро и красиво.
Обращаем внимание на входной параметр bool - именно он определяет, что будет: кодировка или декодировка.
Создаем просторный буфер, создаем классическую обертку FileStream.Read==>FileStream.Write
Первая у нас открывает исходный файл, вторая будет сохранять результат в новый файл.
Готовим массив байтов на bufferSize. Для кодирования HEX используется 18-символьный ключ.
Допускаются только цифры, для чего пишем проверку:
Собственно проверяем длину и то, что вводятся именно цифры. Это сделано как пример, остальные могут сделать свою реализацию.
Ну а теперь немного магии:
Что мы тут такого натворили? Мы прочитали по-байтово файл, перекодировали ASCII-код в integer
используя конструкцию bytes.Select.ToArray, с помощью bool CoderMode задали режим кодирования.
А потом с каждый int из массива bytesAsInts произвели математическое преобразование используя пару констант и натуральный логарифм. Умножение на "минус единицу" сделано, чтобы результат всегда был положительный.
Возьмем к примеру байт 0x78, который к примеру соответствует букве А.
Мы с ним немного повозились, и 0x78 теперь 0x31 и это уже не буква А . Таким образом мы произвели кодирование, которое в итоге изменяет значение байта, но это не влияет на размер итогового файла.
Если таким способом закодировать pdf или docx - разницы в размере не будет, но программы скажут, что файл возможно поврежден. На самом деле с ним всё ОК, и с помощью декодировки, используя тот же самый 18-символьный ключ, можно восстановить файл обратно со 100% гарантией.
Функция, реализующая обратный процесс:
Все так же, только математически наоборот. На вход этой функции нужно подать зашифрованный HEX-методом файл. (выберите не шифрованный, получите кракозябры).
Обработчик вешается так же:
На этом метод HEX-завершен. Теперь посмотрим, как это работает. Выбираем любой файл, для начала что-нибудь небольшое, вводим ключ и нажимаем "Кодировка HEX". Диалоговых окон пока не предусмотрено, просто смотрим, появился ли файл с расширением .shirase
Обратите внимание - оба файла, и оригинал, и закодированный имеют одинаковый размер.
1 207 870 байт - оригинал
1 207 870 байт - shirase-файл
Теперь проверяем структуру, используя инструмент WinMerge:
Думаю, принцип теперь понятен.
Теперь переименуем оригинальный файл, чтобы его не затереть. Попробуем расшифровать файл shirase. Выбираем его и нажимаем "Декодировать HEX". Рядом окажется оригинальный:
Попробуем его открыть.
Как видим - всё ОК.
Таким вот простым способом, используя похожие методы, вполне могут действовать всяческие вирусы-шифровальщики. Вообще ничего не мешает переделать этот код под полностью автономного бота, который будет шифровать всё подряд, указав ему папку, с которой нужно начать.
Как это сделать - я показывать по понятным соображениям тут не буду.
На этом первая часть завершена. Исходник и проект для 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#
Идея давно витала в воздухе, реализацию я написал давно, а разместить статью всё было "не досуг". Исправляемся.
Сегодня я покажу, как на C# написать несложную, но весьма интересную программу для шифрования файлов двумя интересными методами (разработанными в недрах моей головы) - кодировкой HEX (в первой части) и кодировкой DEAD5EC (во второй части)
В основе каждого из методов - факторизация чисел, самый оптимальный метод, ибо "факторизация предположительно является
Ссылка скрыта от гостей
задачей. В настоящее время неизвестно, существует ли
Ссылка скрыта от гостей
не
Ссылка скрыта от гостей
факторизации целых чисел."HEX-метод прост и быстр, вполне может использоваться в незаконных целях (и используется в популярных нынче вирусов-шифровальщиков-вымогателей), но я вас предупреждаю, что есть УК РФ.
DEAD5EC-метод более упёртый и ресурсоемкий, максимальный размер файла 40Гб. При обработке этим методом размер temp-файла увеличивается в 100 раз (т.е. 40*100=4000Гб), т.к. что аккуратнее.
Итак, поехали!
Методов будет использоваться много, поэтому сначала подключим все пространства имен:
Мы пишем программу-шифратор, но где же Using System.Cryptography? Нету. Он нам не понадобится, ибо мы реализуем свои собственные функции.
В приложении есть собственно две части: оконный интерфейс и собственно код. Начнем с первого, быстренько накидаем интерфейс. Описывать как тащить кнопочки и пр. не буду - это легко.
Главное сделать 4 кнопки, пару полей и два окошка вывода информации для красоты.
Something like this:
Теперь код.
Для начала объявим переменную pathFile за пределами MainWindow(). Она нам нужна для сохранения пути к файлу.
На кнопку "Открыть" вешаем классический обработчик для выбора файла:
Тут для наглядности есть функция DisplayFile. Что она делает? Она разбивает файл на байты и даёт нам на них посмотреть. Практической пользы эта функция не несет.
Тут всё просто, читаем файл и перегоняем его порциями в байты и выводим на экран в отдельном окошке.
Далее, начнем с реализации функций HEX. На кнопку "Кодировать HEX" вешаем обработчик с вызовом функции Copy. Она у нас будет основная.
Теперь собственно разберем функцию Copy. Именно ей предстоит кодировать файл быстро и красиво.
Обращаем внимание на входной параметр bool - именно он определяет, что будет: кодировка или декодировка.
Создаем просторный буфер, создаем классическую обертку FileStream.Read==>FileStream.Write
Первая у нас открывает исходный файл, вторая будет сохранять результат в новый файл.
Готовим массив байтов на bufferSize. Для кодирования HEX используется 18-символьный ключ.
Допускаются только цифры, для чего пишем проверку:
Собственно проверяем длину и то, что вводятся именно цифры. Это сделано как пример, остальные могут сделать свою реализацию.
Ну а теперь немного магии:
Что мы тут такого натворили? Мы прочитали по-байтово файл, перекодировали ASCII-код в integer
используя конструкцию bytes.Select.ToArray, с помощью bool CoderMode задали режим кодирования.
А потом с каждый int из массива bytesAsInts произвели математическое преобразование используя пару констант и натуральный логарифм. Умножение на "минус единицу" сделано, чтобы результат всегда был положительный.
Возьмем к примеру байт 0x78, который к примеру соответствует букве А.
Мы с ним немного повозились, и 0x78 теперь 0x31 и это уже не буква А . Таким образом мы произвели кодирование, которое в итоге изменяет значение байта, но это не влияет на размер итогового файла.
Если таким способом закодировать pdf или docx - разницы в размере не будет, но программы скажут, что файл возможно поврежден. На самом деле с ним всё ОК, и с помощью декодировки, используя тот же самый 18-символьный ключ, можно восстановить файл обратно со 100% гарантией.
Функция, реализующая обратный процесс:
Все так же, только математически наоборот. На вход этой функции нужно подать зашифрованный HEX-методом файл. (выберите не шифрованный, получите кракозябры).
Обработчик вешается так же:
На этом метод HEX-завершен. Теперь посмотрим, как это работает. Выбираем любой файл, для начала что-нибудь небольшое, вводим ключ и нажимаем "Кодировка HEX". Диалоговых окон пока не предусмотрено, просто смотрим, появился ли файл с расширением .shirase
Обратите внимание - оба файла, и оригинал, и закодированный имеют одинаковый размер.
1 207 870 байт - оригинал
1 207 870 байт - shirase-файл
Теперь проверяем структуру, используя инструмент WinMerge:
Думаю, принцип теперь понятен.
Теперь переименуем оригинальный файл, чтобы его не затереть. Попробуем расшифровать файл shirase. Выбираем его и нажимаем "Декодировать HEX". Рядом окажется оригинальный:
Попробуем его открыть.
Как видим - всё ОК.
Таким вот простым способом, используя похожие методы, вполне могут действовать всяческие вирусы-шифровальщики. Вообще ничего не мешает переделать этот код под полностью автономного бота, который будет шифровать всё подряд, указав ему папку, с которой нужно начать.
Как это сделать - я показывать по понятным соображениям тут не буду.
На этом первая часть завершена. Исходник и проект для 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#