Metadata-Version: 2.4
Name: pyarmor2
Version: 0.1.0
Summary: Защита исходного кода Python: шифрование + привязка к папке dist
Author-email: Egor <gobozeti@gmail.com>
License: MIT
Project-URL: Homepage, https://github.com/tumka82290-eng/pyarmor2
Project-URL: Repository, https://github.com/tumka82290-eng/pyarmor2
Keywords: obfuscation,encryption,protect,cli
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Environment :: Console
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: cryptography>=41.0

# pyarmor2

Защита Python-скриптов: шифрование исходника + жёсткая привязка запуска
к неизменённой папке `dist/`.

## Установка

```
pip install pyarmor2
```

## Использование

Собрать защищённый dist:

```
pyarmor2 gen file.py
```

Результат:

```
file.py.key         <- секретный ключ восстановления, хранить отдельно
dist/
├── file.py          <- тонкий stub, читать бессмысленно
└── _pyarmor2_data/
    ├── payload.bin   <- зашифрованный байткод (для запуска)
    ├── master.bin     <- зашифрованный исходник (для unlock)
    ├── manifest.json  <- хэши файлов dist для проверки целостности
    ├── _pyarmor2_runtime.py
    └── _pyarmor2_crypto.py
```

Запуск (только из этой папки, с этими файлами рядом):

```
python dist/file.py
```

Восстановить исходник:

```
pyarmor2 unlock dist file.py.key
```

## Нативный runtime (.so/.pyd)

`runtime.py` и `crypto.py` скомпилированы через Cython в `.so` (Linux) —
сейчас собрана только сборка для `linux_x86_64`. Скомпилированный код
не читается текстовым редактором и не содержит docstring/строковых
сообщений в открытом виде (проверено через `strings`).

Чтобы собрать `.so`/`.pyd` под другую платформу (Windows/macOS/ARM),
на соответствующей машине:

```
pip install cython setuptools
cd pyarmor2
python setup_native.py
```

Результат (`_pyarmor2_runtime.*.so|pyd`, `_pyarmor2_crypto.*.so|pyd`)
нужно вручную перенести в `pyarmor2/_native/<tag>/`, где `<tag>` один из:
`linux_x86_64`, `linux_arm64`, `win_x86_64`, `win_arm64`, `macos_x86_64`,
`macos_arm64` (см. `builder.py::_native_platform_tag`).

Если для текущей платформы нет готовой `.so`-сборки, `gen` автоматически
откатывается на `.py`-версию runtime (менее защищённую, но рабочую) -
это гарантирует, что команда не сломается на новой платформе.

## Как это работает

- Ключ выполнения нигде не хранится: он выводится на лету из встроенного
  секрета и хэша реальных файлов в `dist/`. Изменение любого байта в
  `dist/` меняет хэш и ломает вывод ключа.
- Ключ восстановления (`file.py.key`) - отдельный, случайный, не связан с
  ключом выполнения. Он шифрует независимую копию исходника (`master.bin`).
