python代码加密cython_python通过cython加密代码

#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,将使用“.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('

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python代码可以被编译成字节码文件,这可以让代码更难以阅读和修改,但是并不是真正的加密。如果你需要加密Python代码,你可以使用以下工具: 1. PyArmor:PyArmor是一个开源工具,可以将Python代码加密和混淆,以保护代码的知识产权。它使用自定义的加密算法,可以在Python解释器中运行加密代码。 2. PyObfuscate:PyObfuscate是另一个开源工具,可以将Python代码混淆,使得代码更难以理解和分析。它使用多种技术,包括变量重命名、控制流混淆和代码替换等。 3. CythonCython是一个Python的静态类型扩展,它可以将Python代码编译成C代码,并生成可执行文件。这可以使Python代码更加难以逆向工程,但是也需要更多的时间和资源来完成。 请注意,尽管这些工具可以使代码更难以阅读和修改,但它们并不能完全保护代码的安全性。如果你需要真正的安全保障,建议采用其他安全措施,例如访问控制、加密存储等。 ### 回答2: 对Python代码进行加密可以采取以下几种方式: 1. 混淆代码:通过改变变量名、函数名和类名等,使代码变得难以理解。可以使用工具如Pyminifier、PyObfuscate等来进行代码混淆。 2. 字符串加密:对代码中的字符串进行加密,使得代码中的关键信息难以被直接读取。可以使用加密算法如Base64、AES等对字符串进行加密,然后在代码中进行解密。 3. 字节码加密:将Python代码转换为字节码,以实现对代码的保护。可以使用工具如py2exe、py2app等将源代码转换为可执行文件,使代码难以被反编译。 4. 特殊模块加密:将敏感的部分代码封装在特殊的加密模块中,只向特定用户提供解密密钥。通过这种方式,即使代码被获取,也无法正常运行。 5. 密钥加密:使用密钥对代码进行加密,只有拥有正确密钥的用户才能解密并执行代码。可以使用工具如PyCryptodome等进行对称或非对称加密。 需要注意的是,虽然可以采取各种方式对Python代码进行加密,但绝对的安全是不存在的。加密只能提高代码的安全性,但不可能完全抵御攻击。因此,在编写代码时,应注意遵循安全的编程实践,避免在代码中存储敏感信息,并定期对代码进行审核和更新,以保证代码的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值