时间:2020-12-12来源:www.pcxitongcheng.com作者:电脑系统城
#coding=utf-8 import getopt import os, sys import zipfile from Crypto.Cipher import AES import random, struct #加密python3的代码 def transfer3(dir_pref): os.system( 'cython -2 %s.py;' 'gcc -c -fPIC -I/usr/include/python3.5/ %s.c -o %s.o' % (dir_pref, dir_pref, dir_pref)) os.system( 'gcc -shared %s.o -o %s.so' % (dir_pref, dir_pref)) if clear: os.system( 'rm -f %s.c %s.o %s.py' % (dir_pref, dir_pref, dir_pref)) else : os.system( 'rm -f %s.c %s.o' % (dir_pref, dir_pref)) #加密python2的代码 def transfer2(dir_pref): os.system( 'cython -2 %s.py;' 'gcc -c -fPIC -I/usr/include/python2.7/ %s.c -o %s.o' % (dir_pref, dir_pref, dir_pref)) os.system( 'gcc -shared %s.o -o %s.so' % (dir_pref, dir_pref)) if clear: os.system( 'rm -f %s.c %s.o %s.py' % (dir_pref, dir_pref, dir_pref)) else : os.system( 'rm -f %s.c %s.o' % (dir_pref, dir_pref)) #加密AI模型 def encrypt_file(in_filename, out_filename = None , chunksize = 64 * 1024 ): """ 使用AES(CBC模式)加密文件给定的密钥。 :param key: 加密密钥-必须是16、24或32字节长。长按键更安全。 :param in_filename: 输入的文件的名称 :param out_filename: 如果为None,将使用“<in_filename>.enc”。 :param chunksize: 设置函数用于读取和加密文件。大块一些文件和机器的大小可能更快。块大小必须可被16整除。 :return: None """ if not out_filename: out_filename = in_filename + '.enc' salt = '' # 盐值 key = "{: <32}" . format (salt).encode( "utf-8" ) #iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16)) #encryptor = AES.new(key, AES.MODE_CBC, iv) iv = b '0000000000000000' encryptor = AES.new(key, AES.MODE_CBC, iv) filesize = os.path.getsize(in_filename) with open (in_filename, 'rb' ) as infile: with open (out_filename, 'wb' ) as outfile: outfile.write(struct.pack( '<Q' , filesize)) outfile.write(iv) while True : chunk = infile.read(chunksize) if len (chunk) = = 0 : break elif len (chunk) % 16 ! = 0 : chunk + = ( ' ' * ( 16 - len (chunk) % 16 )).encode( "utf-8" ) outfile.write(encryptor.encrypt(chunk)) def zip_dir(dir_path,out_path): """ 压缩指定文件夹 :param dir_path: 目标文件夹路径 :param out_path: 压缩文件保存路径+xxxx.zip :return: 无 """ zip = zipfile.ZipFile(out_path, "w" , zipfile.ZIP_DEFLATED) for path, dirnames, filenames in os.walk(dir_path): # 去掉目标跟路径,只对目标文件夹下边的文件及文件夹进行压缩 fpath = path.replace(dir_path, '') for filename in filenames: zip .write(os.path.join(path, filename), os.path.join(fpath, filename)) zip .close() if __name__ = = '__main__' : help_show = ''' python version: python3 该代码用于加密python3编写的代码,将.py文件转换成.so文件,达到加密的效果 python2 该代码用于加密python2编写的代码,将.py文件转换成.so文件,达到加密的效果 Options: -h, --help 显示帮助 -d, --directory 你需要加密的文件夹 -o, --operation 你所需要执行的操作,python3 or python2 or model -f, --file 加密单个py文件 -c, --clear 删除原始的py文件 -m, --maintain 列出你不需要加密的文件和文件夹,如果是文件夹的话需要加[] 例子: -m __init__.py,setup.py,[poc,resource,venv,interface] -z, --zip 加密之后压缩文件 Example: python setup.py -f test_file.py -o python2 加密单个文件 python setup.py -d test_dir -o python2 -m __init__.py,setup.py,[poc/,resource/,venv/,interface/] -c 加密文件夹 python3 setup.py -f test_file.py -o python3 加密单个文件 python3 setup.py -d test_dir -o python3 -m __init__.py,setup.py,[poc/,resource/,venv/,interface/] -c 加密文件夹 ''' clear = 0 is_zip = False root_name = '' operation = '' file_name = '' m_list = '' try : options,args = getopt.getopt(sys.argv[ 1 :], "vh:d:f:cm:o:z:" ,[ "version" , "help" , "directory=" , "file=" , "operation=" , "zip" , "clear" , "maintain=" ]) except getopt.GetoptError: print (help_show) sys.exit( 1 ) for key, value in options: if key in [ '-h' , '--help' ]: print (help_show) elif key in [ '-c' , '--clear' ]: clear = 1 elif key in [ '-d' , '--directory' ]: root_name = value elif key in [ '-f' , '--file' ]: file_name = value elif key in [ '-o' , '--operation' ]: operation = value elif key in [ '-z' , '--zip' ]: is_zip = True elif key in [ '-m' , '--maintain' ]: m_list = value file_flag = 0 dir_flag = 0 if m_list.find( ',[' ) ! = - 1 : tmp = m_list.split( ',[' ) file_list = tmp[ 0 ] dir_list = tmp[ 1 : - 1 ] file_flag = 1 dir_flag = 1 elif m_list.find( '[' ) ! = - 1 : dir_list = m_list[ 1 : - 1 ] dir_flag = 1 else : file_list = m_list.split( ',' ) file_flag = 1 if dir_flag = = 1 : dir_tmp = dir_list.split( ',' ) dir_list = [] for d in dir_tmp: if d.startswith( './' ): dir_list.append(d[ 2 :]) else : dir_list.append(d) if root_name ! = '': if not os.path.exists(root_name): print ( 'No such Directory, please check or use the Absolute Path' ) sys.exit( 1 ) if os.path.exists( '%s_old' % root_name): os.system( 'rm -rf %s_old' % root_name) #os.system('cp -r %s %s_old' % (root_name, root_name)) #备份源文件 try : for root, dirs, files in os.walk(root_name): for file in files: if m_list ! = '': skip_flag = 0 if dir_flag = = 1 : for dir in dir_list: if (root + '/' ).startswith(root_name + '/' + dir ): skip_flag = 1 break if skip_flag: continue if file_flag = = 1 : if file in file_list: continue pref = file .split( '.' )[ 0 ] dir_pref = root + '/' + pref if file .endswith( '.pyc' ): os.system( 'rm -f %s' % dir_pref + '.pyc' ) elif file .endswith( '.so' ): pass elif file .endswith( '.py' ): if operation = = 'python3' : transfer3(dir_pref) elif operation = = 'python2' : transfer2(dir_pref) else : pass except Exception as e: print (e) if file_name ! = '': try : dir_pref = file_name.split( '.' )[ 0 ] if operation = = 'python3' : transfer3(dir_pref) elif operation = = 'python2' : transfer2(dir_pref) else : pass except Exception as e: print (e) if is_zip: zip_dir(root_name,root_name + '.zip' ) if operation = = 'model' : encrypt_file(root_name) |
以上就是python通过cython加密代码的详细内容
2023-03-17
python flask项目打包成docker镜像发布的过程2023-03-17
python调试模块ipdb详解2023-03-17
python使用openai生成图像的超详细教程python cron定时任务触发接口自动化巡检 apscheduler报错:Run time of job …… next run at: ……)” was missed by misfire_grace_time参数 找到任务超时的根本原因...
2023-03-15