Protect your python script, encrypt .pyc to .pye and decrypt when import it
- Build the execution
pyconcrete
and read theMAIN.pye
which encrypted by your passphrase. - pyconcrete will decrypt the source file and then launch python interpreter to do the normal python behavior.
- pyconcrete will hook import module
- when your script do
import MODULE
, pyconcrete import hook will try to findMODULE.pye
first and then decryptMODULE.pye
via_pyconcrete.pyd
and execute decrypted data (as .pyc content) - encrypt & decrypt secret key record in
_pyconcrete.pyd
(like DLL or SO) the secret key would be hide in binary code, can't see it directly in HEX view
- only support AES 128 bit now
- encrypt & decrypt by library OpenAES
Pyconcrete has transitioned to using meson-python as its build backend starting from version 1.0.0. This provides a more powerful build mechanism and supports newer Python versions.
For older Python support:
- Pyconcrete versions prior to 0.15.2 only support up to Python 3.10.
- If you need support for Python 3.6 or Python 2.7, please use versions before 0.15.2.
- Pyconcrete no longer supports Python versions earlier than 3.6.
For unix base
- apt: pkg-config, build-essential, python{version}-dev
- pip: 23.1+
Due to security considerations, you must provide a passphrase to create a secret key for encrypting Python scripts:
- The same passphrase will generate the same secret key.
- Pre-built packages are not provided, so users must build the package yourself.
Build Process
- Pyconcrete relies on Meson to compile the C extension.
- The installation process will add a
pyconcrete.pth
file to yoursite-packages
, enablingsitecustomize.py
to automatically import Pyconcrete.
- Need to config the passphrase for installation. And only pip 23.1+ support passing argument via
-C
or--config-settings
. - Remember to assign
--no-cache-dir
to avoid use pip's cached package which already built by old passphrase.
$ pip install pyconcrete \
--no-cache-dir \
--config-settings=setup-args="-Dpassphrase=<Your_Passphrase>"
- convert all of your
.py
to*.pye
$ pyecli compile --pye -s=<your py script>
$ pyecli compile --pye -s=<your py module dir>
- remove
*.py
*.pyc
or copy*.pye
to other folder - main.py encrypted as main.pye, it can't be executed by normal
python
. You must usepyconcrete
to process the main.pye script.pyconcrete
(exe) will be installed in your system path (ex: /usr/local/bin)
pyconcrete main.pye
src/*.pye # your libs
- import pyconcrete in your main script
- project layout
main.py # import pyconcrete and your lib
pyconcrete/* # put pyconcrete lib in project root, keep it as original files
src/*.pye # your libs
- test in local
$ pytest tests
- test in docker environment
$ make test
- test in docker environment for specific python version
$ make test 3.10
https://matthew-brett.github.io/pydagogue/python_msvc.html https://github.com/cython/cython/wiki/CythonExtensionsOnWindows
pyconcrete is an experimental project, there is always a way to decrypt .pye files, but pyconcrete just make it harder.