Как зашифровать код python
Перейти к содержимому

Как зашифровать код python

  • автор:

Защита Python приложений

Первый вариант защищает Python приложения, комбинируя Sentinel Envelope с Sentinel Data File Protection (DFP). Таким образом, защищается непосредственно интерпретатор Python, которому на уровне защиты указывается, с какими файлами он должен работать как с защищенными (зашифрованными), следовательно, такие файлы интерпретатор будет предварительно автоматически расшифровывать и только затем выполнять. Незашифрованные файлы будут работать также, как и ранее. Сами *.py модули, требующие защиты шифруются с помощью инструмента Sentinel Data File Protection (DFP).

Второй вариант подразумевает защиту Python приложений, комбинируя Cython (https://cython.org/) с Sentinel Envelope. Сначала необходимо требующие защиты модули Python перевести в C-Code с помощью Cython и затем скомпилировать их в модули *.pyd / *.so, которые в последствие защищаются с помощью Sentinel Envelope.

Второй метод обеспечивает более высокий уровень безопасности, поскольку дополнительный этап компиляции снижает уровень абстракции кода и позволяет Sentinel Envelope защищать приложение как код, а не только как данные, что позволяет применять более сложные механизмы защиты. С другой стороны, второй метод немного сложнее в настройке, так как требует дополнительно “прослойки” в виде Cython и работающий C-компилятор.

  • 1 Метод #1: защита через шифрование данных (Sentinel Data File Protection)
    • 1.1 Примеры защиты
      • 1.1.1 Для Windows
      • 1.1.2 Для Linux
      • 1.2.1 Сборка приложения и зависимостей в *.py модуль
      • 1.2.2 Шифрование *.py модулей
      • 1.2.3 Защита интерпретатора Python
      • 2.1 Примеры защиты
        • 2.1.1 Для Windows
        • 2.1.2 Для Linux
        • 2.2.1 Трансляция *.py модулей в C-Code с использованием Cython
        • 2.2.2 Сборка C-Файлов в нативное Python приложение (исполняемый файл)
        • 2.2.3 Защита нативного Python приложения (исполняемого файла) с помощью утилиты Envelope

        Метод #1: защита через шифрование данных (Sentinel Data File Protection)

        Защита приложения Python с помощью Sentinel Data File Protection состоит из трех этапов:
        ● Соберите ваше приложение в модули байт-кода *.pyc.
        ● Зашифруйте получившиеся файлы *.pyc с помощью утилиты Sentinel dfcrypt.

        ● Защитите интерпретатор Python, включив в настройках защиты опцию “Enable data file protection (Data Protection Utility) = Version 2” для работы защищённого интерпретатора с зашифрованными файлами данных. Защищенное приложение может распространяться путем упаковки защищенного с помощью Envelope интерпретатора вместе с зашифрованными *.pyc файлами (например, с использованием pyinstaller).

        Примечание: Важно всегда защищать скомпилированный байт-код Python (*.pyc), а не простой исходный код Python (.py). Причина в том, что интерпретатор Python сначала переводит файлы *.py в файлы *.pyc, которые затем записываются на диск, чтобы ускорить последующее выполнение. При предоставлении защищенного файла *.py вместо файла *.pyc интерпретатор Python сгенерирует открытый текстовый файл *.pyc и запишет его на диск, где он будет доступен для анализа в открытом виде.

        Примеры защиты

        Для Windows

        После установки Sentinel LDK пример, демонстрирующий защиту Python приложения для Windows с помощью Sentinel Data File Protection, можно найти в директории:

        C:\Users\\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \data_file_protection

        Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:

        C:\Users\\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \sample_app

        Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3. Директория data_file_protection содержит:

        ● build_dfp_protected_python2_app.bat

        Этот сценарий защищает и упаковывает пример приложения для Python2 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.

        ● envelope_python2.prjx

        Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python2 (python27.dll) для приведенного выше сценария.

        ● build_dfp_protected_python3_app.bat
        Этот сценарий защищает и упаковывает пример приложения для Python3 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller

        .● envelope_python3.prjx
        Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python3 (python37.dll) для приведенного выше сценария.

        Для Linux

        Пример, демонстрирующий защиту Python приложения для Linux с использованием Sentinel Data File Protection, можно найти в директории:

        /Linux/Samples/Envelope/Python/data_file_protection

        Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:

        /Linux/Samples/Envelope/Python/sample_app

        Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.Директория data_file_protection содержит:

        ● build_dfp_protected_python2_app.sh
        Этот сценарий защищает и упаковывает пример приложения для Python2 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.

        ● build_dfp_protected_python3_app.sh
        Этот сценарий защищает и упаковывает пример приложения для Python3 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.

        Процесс защиты

        Шаги для создания защищенного приложения с использованием Sentinel Data File Protection и Sentinel Envelope:

        Сборка приложения и зависимостей в *.py модуль

        Запустите pyinstaller с параметрами: «-d noarchive» для требующего защиты*.py модуля, например:
        pyinstaller -d noarchive main.py

        Этот шаг собирает зависимости вашего приложения и компилирует их в байт-код Python. «-d noarchive» инструктирует pyinstaller хранить скомпилированные модули Python как отдельные файлы, что является обязательным требованием для следующего шага шифрования.Результатом этого шага является автономная папка (dist/), содержащая ваше приложение и все его зависимости.Примечание: Если установленный pyinstaller не поддерживает ключ «-d noarchive», он слишком стар и его необходимо обновить с помощью команды

        pip:pip install pyinstaller —upgrade

        Шифрование *.py модулей

        Используйте dfcrypt для шифрования чувствительных модулей байт-кода вашего приложения, например:

        dfcrypt —encrypt —encver:2 «—key:A secret» —vcf:DEMOMA.hvc —fid:0 dist//moduleA.pyc encrypted/moduleA.pyc

        dfcrypt —encrypt —encver:2 «—key:a secret» —vcf:DEMOMA.hvc —fid:0 dist//moduleB.pyc encrypted/moduleB.pyc

        Хотя это и не является строго обязательным, рекомендуется использовать ключ «—key:» для указания общего ключа шифрования для всех модулей приложения. Это позволяет использовать логику кэширования, которая может существенно улучшить время запуска приложения, использующего большое количество защищенных модулей. Не указывая «—key:», команда dfcrypt выбирает случайный ключ для каждого файла.Когда закончите с шифрованием, замените исходные файлы их зашифрованным аналогом, например:

        copy encrypted/moduleA.pyc dist//
        copy encrypted/moduleB.pyc dist//

        Защита интерпретатора Python

        Защитите с помощью Envelope библиотеку интерпретатора Python (*.dll / *.so) с поддержкой возможности чтения зашифрованных файлов данных:

        Например в Linux и Python2:

        linuxenv —vcf:DEMOMA.hvc —fid:0 —dfp dist//libpython2.7.so.1.0 dist//libpython2.7.so.1.0

        Ключ «—dfp» активирует Data File Protection, что позволяет защищенному интерпретатору Python выполнять зашифрованные модули Python.

        В Windows используйте Sentinel Envelope и активируйте Data File Protection Version 2.
        Скопируйте выходные файлы Envelope в директорию:

        Чтобы развернуть защищенное приложение, просто скопируйте папку dist/ на целевой компьютер.Ваше защищенное приложение можно запустить, выполнив команду вида:

        Метод #2: экспорт модулей через Cython и защита с помощью Sentinel Envelope

        1. Переведите ваши модули Python (*.py) в C-Code, используя Cython.
        2. Скомпилируйте полученные C-файлы в модули расширения Python (*.pyd / *.so), используя C-компилятор для вашей платформы 1 .
        3. Защитите полученные модули расширения Python (*.pyd / *.so) с помощью Sentinel Envelope.

        Примеры защиты

        Для Windows

        После установки Sentinel LDK пример, демонстрирующий защиту приложения Python для Windows с использованием Cython и Sentinel Envelope, можно найти в директории:

        C:\Users\\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \cythonize_and_envelope

        Скрипты демонстрирующие защиту простого приложения Python, которое можно найти в директории:

        C:\Users\\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \sample_app

        Пример приложения представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.

        Директория cythonize_and_envelope содержит:

        ● build_python2.bat Этот сценарий защищает и упаковывает пример приложения для Python2 под Windows, с использованием: кода разработчика DEMOMA, Cython, компилятора Microsoft Visual C ++ для Python 2.7, Sentinel Envelope и pyinstaller.

        ● envelope_cythonized_py2modules.prjx
        Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.

        ● build_python3.bat Этот сценарий защищает и упаковывает пример приложения для Python3 под Windows, с использованием: кода разработчика DEMOMA, Cython, Microsoft Build Tools для Visual Studio 2019, Sentinel Envelope и pyinstaller.

        ● envelope_cythonized_py3modules.prjx
        Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.

        Для Linux

        Пример защиты приложения Python для Linux с использованием Cython и Sentinel Envelope можно найти в директории:

        /Linux/Samples/Envelope/Python/cythonize_and_envelope

        Прилагаемые скрипты демонстрируют защиту простого приложения Python, которое можно найти в директории:

        /Linux/Samples/Envelope/Python/sample_app

        Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.

        Директория cythonize_and_envelope содержит:

        ● build_python2.sh
        Этот сценарий защищает и упаковывает приложение для Python2 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.

        ● build_python3.sh
        Этот сценарий защищает и упаковывает приложение для Python3 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.

        Процесс защиты

        Шаги для создания защищенного приложения с использованием Cython и Sentinel Envelope:

        Трансляция *.py модулей в C-Code с использованием Cython

        Для защиты необходимо сначала изменить расширение вашего модуля Python с *.py на *.pyx, потому что это позволяет Cython генерировать код, который может быть лучше защищен с помощью Sentinel Envelope.Cython может быть установлен с использованием команды

        pip:pip install cython —upgrade
        Запустите cython и укажите, должен ли он обрабатывать код как Python 2 или Python 3:
        cython -2 —no-docstrings .\moduleA.pyx
        cython -3 —no-docstrings .\moduleA.pyx
        Результатом является представление модуля Python в виде C-кода ( moduleA.c).

        Сборка C-Файлов в нативное Python приложение (исполняемый файл)

        Для Windows:Установите требуемый компилятор:

        ● Python2: Microsoft Visual C++ Compiler для Python 2.7

        ● Python3: Microsoft Build Tools для Visual Studio 2019 https://visualstudio.microsoft.com/ru/downloads/

        Запустите консоль (cmd-shell) и выполните команду:

        ● Python2: C:\Users\\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat» amd64

        ● Python3: C:\\VC\Auxiliary\Build\vcvarsall.bat» amd64

        Выполните следующие команды в консоли, чтобы скомпилировать C-код:

        ● Python2: cl /nologo /c /MD /Ox /W3 /I C:\Python27\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python27\libs\python27.lib moduleA.obj

        ● Python3: cl /nologo /c /MD /Ox /W3 /IC:\Python37\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python37\libs\python37.lib moduleA.obj

        В результате получите модуль расширения Python для Windows (moduleA.pyd).Для Linux:

        Установите GCC-Compiler с помощью менеджера пакетов вашего дистрибутива Linux, например следующей командой в консоли:

        apt install gcc

        Установите пакет разработчика Python, используя менеджер пакетов вашего дистрибутива Linux, например:

        apt install python2-dev

        apt install python3-dev

        Выполните следующие команды, чтобы скомпилировать C-код:

        ● Python2: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so

        ● Python3: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I «/usr/include/python3.7» -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so

        В результате получите модуль расширения Python для Linux (moduleA.so).

        Защита нативного Python приложения (исполняемого файла) с помощью утилиты Envelope

        Пример команды для защиты для Linux:

        linuxenv —vcf:DEMOMA.hvc —fid:0 plain/moduleA.so prot/moduleA.so

        Для Windows используйте Sentinel Envelope точно так же, как при защитите обычного dll/exe файла.

        Шифрование набора инструментов Python

        По умолчанию набор инструментов Python ( .pyt ) – это текстовой файл, который можно редактировать в любом текстовом редакторе или в среде разработки Python IDE. Однако в некоторых случаях может потребоваться скрыть исходный код набора инструментов Python.

        Чтобы зашифровать набор инструментов Python, щелкните на нем правой кнопкой мыши и выберите Зашифровать . При вводе и подтверждении пароля можно сохранить резервную копию исходного файла .pyt .

        Внимание:

        Шифрование набора инструментов Python производится непосредственно для самого файла, и исходный незашифрованный файл будет переписан. Создание резервной копии исходного набора инструментов Python рекомендуется на случай, если вы забудете пароль.

        Чтобы зашифровать набор инструментов Python, щелкните на нем правой кнопкой мыши и выберите Зашифровать .

        Также имеются функции ArcPy EncryptPYT и DecryptPYT для шифрования и расшифровки наборов инструментов Python.

        PyArmor: как запутать код, чтобы защитить программное обеспечение

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

        17 показов
        4.2K открытий

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

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

        Разработчики скриптов знают, что код на Python поддерживает анализ байт-кода, позволяющий ускорять работу интерпретатора и сам код на Python очень сложно защитить от нежелательного просмотра третьими лицами. Даже новички в разработке скриптов на Python могут заполучить исходный скрипт .py из файла .exe.

        Для этого случая на Python существует очень полезная библиотека pyarmor с помощью которой можно воспользоваться всеми вышеизложенными функциями защиты скрипта от нежелательного взлома и метод, который позволяет защитить код называется обфускация.

        Библиотека PyArmor имеет несколько вариантов работы – через консоль, а также с использованием localhost GUI – графического пользовательского интерфейса.

        Установка и использование библиотеки pyarmor

        В консоли необходимо выполнить следующую команду, чтобы установить модуль:

        pip install pyarmor

        Для того чтобы начать работу с графическим интерфейсом библиотеки необходимо сперва его установить, выполнив следующую команду:

        pip install pyarmor—webui

        Библиотеки успешно установлены, теперь можно приступить непосредственно к самому шифрованию скрипта.

        В первую очередь необходимо создать отдельную папку, в которой будет храниться скрипт с кодом «my_script.py».

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

        def math_primer1(x, y): return x + y * x * y def math_primer2(x, y): return x * y ** (x + y) if __name__ == «__main__»: result1 = math_primer2(2, 3) result2 = math_primer1(1, 2) print(result1, result2)

        Теперь зашифрую этот код, выполнив в консоли несколько команд.

        Для начала необходимо изменить путь до директории в которой лежит файл через:

        cd [Полный путь до файла my_script.py]

        Затем необходимо выполнить команду обфускации:

        Кодировки и шифрование¶

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

        Наиболее распространённые кодировки

        Обозначение в python

        Латинские буквы, цифры и простые символы

        Кириллическая кодировка (русский и другие языки)

        Кодировка для русского языка

        Юникод-кодировка, все языки (длина символа — 8 бит)

        Юникод-кодировка, все языки (длина символа — 16 бит)

        Unicode — стандарт кодирования символов, включающий в себя знаки почти всех письменных языков мира. В настоящее время стандарт является преобладающим в Интернете.

        • стандарт включает более 138 тысяч символов;
        • каждый символ имеет определённое название и код (номер);
        • коды состоят из латинских букв и шестнадцатеричных цифр, например: U+0073 .

        Примеры кодов, имен и соответствующих символов:

        • U+0073 , «LATIN SMALL LETTER S» — s
        • U+1F383 , «JACK-O-LANTERN» — ��
        • U+2615 , «HOT BEVERAGE» — ☕

        Конвертация данных между байтам и строками¶

        Данные по сети передаются, как правило, в байтах. Например, метод socket.recv() получает данные в байтах. Чтобы преобразовывать данные из байт в строки и наоборот используются специальные методы:

        • метод encode(‘encoding_name’) — позволяет перевести данные из строки в байты (str -> bytes);
        • метод decode(‘encoding_name’) — позволяет перевести данные из байт в строку (bytes -> str);

        В коде будет выглядеть так:

        # кодирование строки в байты s = 'привет' s_bytes = s.encode ('utf-8') print (s_bytes) Out: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' # декодирование байт в строку s_dec = s_bytes.decode ('utf-8') print (s_dec) Out: привет 

        При работе с кодировкой важно помнить:

        1. Если вы кодируете строку в байты кодировкой UTF-8, то и перекодировать её из байт нужно этой же кодировкой. Некоторые кодировки совместимы, но в большинстве случаев, нарушения этого правила ведёт к потере данных.
        2. В своём коде всегда используйте кодировки Unicode, оптимально UTF-8, она используется по умолчанию в большинстве методов и функций, так что это снижает риск ошибок.
        3. Декодирование байтовых данных в строки лучше производить сразу после их получения, а кодирование в байты — только перед отправкой. В коде лучше работать с привычными типами данных (строки, списки, числа), не с байтами, ведь большинство методов в Python с байтовыми строками не работают (или работают не так, как можно ожидать).

        Шифрование¶

        Шифр Цезаря

        Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите. Например, в шифре со сдвигом вправо на 3, A была бы заменена на D, B станет E, и так далее.

        Повторить шифр можно в занятии

        Формула для кодирования символа:

        symbol_encoded = ((((symbol) - first + key) % size) + first) 

        Шифр пар

        Алфавит случайным образом записывают в 2 строки, и шифрование текста происходит заменой буквы на соседнюю ей по вертикали. Например:

        ['v', 'q', 'f', 's', 'p', 'u', 'n', 'a', 'm', 'j', 'c', 'k', 'h'] ['l', 'r', 'o', 'e', 'x', 'd', 'z', 'g', 'b', 'w', 't', 'i', 'y'] In: hello Out: ysvvf 

        Шифр Виженера

        На алфавите длиной N вводят операцию добавления (циклического сдвига) букв. Пронумеровав буквы, добавляем их по модулю N (для англ. алфавита N=26).

        Выбираем слово-ключ (пускай pass) и подписываем его под сообщением сколько нужно раз:

        Сообщение: search Ключ: passpa Шифр: hesjrh 

        Задания¶

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

        2. Напишите функцию для шифрования файла шифром Цезаря. Расшифруйте:

        key = 2 s = 'Oquv uvctu ctg qdugtxgf vq dg ogodgtu qh dkpctb uvct ubuvgou' 

        3. Напишите функцию для шифрования файла шифром пар. Расшифруйте:

        d_1 = [109, 122, 106, 115, 100, 99, 105, 120, 110, 98, 121, 118, 107] d_2 = [112, 103, 108, 104, 111, 102, 119, 117, 97, 101, 116, 113, 114] s = 'A hynk wh na nhykdadpwfnj delbfy fdahwhywaz dc n jxpwadxh hmsbkdwo dc mjnhpn sbjo ydzbysbk et wyh dia zknqwyt.' 

        4.* Напишите функцию для шифрования файла шифром Виженера. Расшифруйте. 5. Добавьте в чат (с кодировкой) возможность выполнять шифрование и дешифрование сообщения одним из шифров по выбору пользователя. 6. Доработайте чат таким образом, чтобы пользователь отправлял серверу имя зашифрованного файла и шифр, а сервер дешифровал его и отправлял содержимое файла обратно пользователю.

        Полезные ссылки¶

        1. Шифр подстановки
        2. Элементарная криптография

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *