Python代码加密方案

Python代码加密方案

方案1:使用Pyarmor工具进行加密

PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 Python 源代码的有效期限,绑定加密后的Python源代码到硬盘、网卡等硬件设备。

1、安装
pip install pyarmor

# 验证是否安装成功, 7.0 以下版本为稳定版
pyarmor --version
2、加密过程
  • 首先把源代码编译成代码块

    char *filename = "foo.py";
    char *source = read_file( filename );
    PyCodeObject *co = Py_CompileString( source, "<frozen foo>", Py_file_input );
    
  • 接着进行如下处理

    1. 使用 try…finally 语句把代码块的代码段 co_code 包裹起来

      新添加一个头部,对应于 try 语句:
      
              LOAD_GLOBALS    N (__armor_enter__)     N = length of co_consts
              CALL_FUNCTION   0
              POP_TOP
              SETUP_FINALLY   X (jump to wrap footer) X = size of original byte code
      
      接着是处理过的原始代码段:
      
              对于所有的绝对跳转指令,操作数增加头部字节数
      
              加密修改过的所有指令代码
      
              ...
      
      追加一个尾部,对应于 finally:
      
              LOAD_GLOBALS    N + 1 (__armor_exit__)
              CALL_FUNCTION   0
              POP_TOP
              END_FINALLY
      
    2. 添加字符串名称 __armor_enter, __armor_exit__ 到 co_consts

    3. 如果 co_stacksize 小于 4,那么设置为 4

    4. 在 co_flags 设置自定义的标志位 CO_OBFUSCAED (0x80000000)

    5. 按照上面的方式递归修改 co_consts 中的所有类型为代码块的常量

  • 然后把改装后的代码块转换成为字符串,把字符串进行加密,保护其中的常量和字符串

    char *string_code = marshal.dumps( co );
    char *obfuscated_code = obfuscate_algorithm( string_code  );
    
  • 最后生成加密后的脚本,写入到磁盘文件

    sprintf( buf, "__pyarmor__(__name__, __file__, b'%s')", obfuscated_code );
    save_file( "dist/foo.py", buf );
    
3、加密模式

PyArmor 提供多种加密模式,以满足安全和性能方面的平衡。通常情况下,默认 的加密模式能够满足绝大多数的需要,一般情况下也不需要对加密模式有详细 的了解。仅当对性能有特别的要求或者默认加密模式无法满足需求的时候,才需 要改变加密模式,这就需要理解 PyArmor 的不同加密模式。

  • 默认加密模式

    加密脚本命令

    pyarmor obfuscate xx.py

  • 超级模式

    目前支持版本

    1. python 2.7

    2. python 3.7

    加密脚本命令

    pyarmor obfuscate --advanced 2 xx.py

  • 高级模式

    加密脚本命令

    pyarmor obfuscate --advanced 1 xx.py

  • 其他加密模式(不常用)

    1. 代码加密模式

    2. 代码包裹模式

    3. 模块加密模式

    4. 约束模式

4、使用pyarmor
  1. 加密脚本

    pyarmor [command] [options]

    常用命令:pyarmor obfuscate main.py

    pyarmor会加密main.py文件和相同目录下的所有*.py文件,并创建输出子目录dist, 生成加密的主脚本main,py、相同目录下的**.py、生成的运行加密脚本所需的全部辅助文件保存到dis输出目录

  2. 发布加密脚本

    发布加密脚本给客户只需要把输出路径dist的所有文件拷贝过去即可

  3. 生成新的许可文件(可选)

    使用命令 licenses为加密脚本生成新的许可文件license.lic,加密脚本的同时会在输出目录下面生成一个默认许可文件,dist/licnese.lic,需要生成新的许可文件,并覆盖默认许可文件

    例如:

    pyarmor licneses --expired 2019 -01-01 code-001

    执行该命令会生成一个带有效期的认证文件,这样超过指定日期后加密脚本就无法正常运行了

  4. 绑定加密脚本到固定机器上(可选)

    如果想绑定加密脚本到固定机器上,首先在该机器上面运行下面的命令获取硬件信息

    pyarmor hdinfo

    然后生成绑定到固定机器的许可文件

    pyarmor licenses --bind-disk “100304PBN2081SF3NJ5T” --bind-mac “20:c1:d2:2f:a0:96” code-002,

    同样,覆盖默认的许可证,这样加密脚本就只能在指定机器上运行

6、命令手册

点击查看

7、优缺点
  1. 优点

    • 使用方便,加密脚本较快且能一键加密,操作较简单

    • 多种加密模式,满足常规绝大多数的加密要求

    • 有文档支持,对于常见的错误异常可以通过查阅官方文档解决

    • 支持其他功能,例如,检查加密脚本的性能、交叉保护机制

    • 可以设置加密文件有效期及绑定在固定机器上

  2. 缺点

    • 每个大的版本的改动比较大,安装时需要查看官方文档选用合适的版本进行安装

    • 个别版本交叉发布时脚本无法运行,具体查看官方文档

    • 安装python版本时需要开启静态库的共享进行安装,否则会无法加密文件

    • 运行加密文件时的python版需要和加密时的python版本一致

    • pyarmor安装的默认是试用版,对加密文件的大小、模块的函数个数等都有限制,用于商业时需要单独购买

方案2:使用cython进行加密
1、安装
pip install cython
2、加密过程
  • 利用Cython将.py文件编译为.c文件

  • 将.c文件编译为为.so或.pyd文件,linux系统为.so文件,Windows系统为.pyd文件

3、使用Cython
  • 创建setup.py加密指定的python文件

    from distutils.core import setup
    from Cython.Build import cythonize
    setup(ext_modules = cythonize(["main.py"], language_level=3)
    
4、简化Cython加密过程

jmpy3为python的一个第三方库,能够将python代码一键加密为.so或者.pyd文件,支持单个文件加密,整个项目加密,加密后会在项目目录中增加一个dist的文件夹,把源文件替换为加密后的文件即可正常运行

  1. 安装

    pip install jmpy3

  2. 切换到项目所在目录,执行以下命令

    jmpy -i 项目名称

  3. 发布加密脚本

    同样加密后会在项目目录中增加一个dist的文件夹,把源文件替换为加密后的文件即可正常运行

5、优缺点
  1. 优点

    • 通过jmpy3可以实现一键加密,加密较为方便

    • 加密后代码运行效率有所提升

    • 生成.so或.pyd文件难以破解

  2. 缺点

    • 兼容性稍差,对于不同的版本的操作系统,需要重新编译

    • 运行加密文件时的python版需要和加密时的python版本一致

    • 没有官方文档,使用加密后的代码出错后,需要自己排查解决错误

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TensSEAL是一个方便的同态加密库,它是Microsoft SEAL的Python接口。它实现了BFV和CKKS两种同态加密算法,并提供了对张量进行加密的功能。使用TensSEAL,你可以隐藏很多具体细节,轻松编写同态加密代码。它是一款适合新手的同态加密库。\[1\] 在TensSEAL中,加密不是直接提供加密函数,而是使用包含加密方案名称的方法,例如bfv_vector。你只需要传入需要加密的明文即可。同时,加密需要提供公钥,也就是生成的上下文对象。\[2\] 上下文对象在TensSEAL中相当于对CKKS的密钥和其他参数进行了封装。在编码、加密、加法、乘法和解密的过程中,只需要将上下文作为参数传入即可。\[3\] 以下是一个使用TensSEAL进行同态加密Python代码示例: ```python import tenseal as ts import numpy as np def gencontext(): context = ts.context(ts.SCHEME_TYPE.CKKS, 8192, coeff_mod_bit_sizes=\[22, 21, 21, 21, 21, 21, 21, 21, 21, 21\]) context.global_scale = pow(2, 21) context.generate_galois_keys() return context def encrypt(context, np_tensor): return ts.ckks_tensor(context, np_tensor) def decrypt(enc_tensor): return np.array(enc_tensor.decrypt().tolist()) def bootstrap(context, tensor): # 刷新已经用尽深度的张量 # 这里 bootstrap = enc(dec()) tmp = decrypt(tensor) return encrypt(context, tmp) if __name__ == "__main__": a = np.array(\[\[1., 2., 3., 4.\], \[1., 2., 5., 4.\]\]) context = gencontext() enc_a = encrypt(context, a) enc_at = encrypt(context, a.T) enc_b = encrypt(context, a) res = enc_a + enc_b # res = enc_a - enc_b # res = enc_a * enc_b # res = enc_a @ enc_at print(decrypt(res)) ``` 这段代码演示了如何使用TensSEAL进行同态加密。首先,我们生成一个上下文对象,然后使用该上下文对象对张量进行加密。最后,我们可以进行加法、减法、乘法和矩阵乘法等操作,并通过解密函数将结果解密。\[1\] #### 引用[.reference_title] - *1* *2* [TenSEAL库介绍:如何开始同态加密](https://blog.csdn.net/watqw/article/details/129539757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [同态加密:CKKS方案详解及一个python实现:TenSEAL](https://blog.csdn.net/weixin_43466027/article/details/118792866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值