这篇文章主要介绍“python加密打包程序的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python加密打包程序的方法是什么”文章能帮助大家解决问题。
python加密打包程序
加密方式:将py文件转为pyd格式
安装easycython模块 pip install easycython
使用easycython命令将py转pyd: easycython xx.py, 会在同一目录生成xx.pyd(如果是64位系统生成的文件名为xx.cp36-win_amd64.pyd);
将xx.cp36-win_amd64.pyd重命名为xx.pyd;
使用pyinstaller打包(由于xx.py和xx.pyd在同一目录, pyinstaller会优先打包pyd), 打包时添加—hidden-import xx选项.
生成的打包文件中会包含xx.pyd;
注意: 如果打包时使用了—key选项, 但打包的模块是pyd格式的, 则pyd文件不会被加密, 只是打包
打包脚本:
打包参数说明:
-F:仅仅生成一个文件,不暴露其他信息,启动较慢。
-D:生成一个文件夹,里面是多文件模式,启动快。
-w:窗口模式打包,不显示控制台。
示例
pyinstaller -F -w -i logo.ico python_file1.py python_file2.py python_file3.py
补充:Python实现文件简单加解密
一、基础知识
python中的异或操作符为 ^ ,也记作XOR,按位异或的结果是:值相同时异或为0,值不同时异或为1,一共有四种情况:0 ^ 0 = 0,0 ^ 1 = 1,1 ^ 0 = 1,1 ^ 1 = 0,使用异或可以对文件进行简单的加解密操作。
加密操作:首先将文件转换为二进制数,再随机生成一个与该二进制等长的密钥,将文件的二进制数与密钥进行异或操作,就能得到加密后的二进制数,存储为加密文件。
解密操作:将加密后的二进制文件与密钥再进行异或操作,就能得到原二进制数,再将原二进制数恢复成文件。
二、加解密算法
1.导入运行库
import json from pathlib import Path from secrets import token_bytes import argparse
2.定义生成密钥函数
def random_key(length): key = token_bytes(nbytes=length) #根据指定长度生成随机密钥 key_int = int.from_bytes(key, 'big') #将byte转换为int return key_int
3.定义加解密单元
def encrypt(raw): #加密单元 raw_bytes = raw.encode() #将字符串编码成字节串 raw_int = int.from_bytes(raw_bytes, 'big') #将byte转换成int key_int = random_key(len(raw_bytes)) #根据长度生成密钥 return raw_int ^ key_int, key_int #将密钥与文件异或,返回异或后的结果和密钥 def decrypt(encrypted, key_int): #解密单元 decrypted = encrypted ^ key_int #将加密后的文件与密钥异或 length = (decrypted.bit_length() + 7) // 8 #计算所占比特大小 decrypted_bytes = int.to_bytes(decrypted, length, 'big') #将int转换回byte return decrypted_bytes.decode() #解码后返回
4.加密文件
def encrypt_file(path, key_path=None, *, encoding='utf-8'): #参数path指定文件地址 path = Path(path) cwd = path.cwd() / path.name.split('.')[0] path_encrypted = cwd / path.name if key_path is None: key_path = cwd / 'key' if not cwd.exists(): cwd.mkdir() path_encrypted.touch() key_path.touch() //打开文件并将内容写入 with path.open('rt', encoding=encoding) as f1, path_encrypted.open('wt', encoding=encoding) as f2, key_path.open('wt', encoding=encoding) as f3: encrypted, key = encrypt(f1.read()) json.dump(encrypted, f2) json.dump(key, f3)
5.解密文件
def decrypt_file(path_encrypted, key_path=None, *, encoding='utf-8'): path_encrypted = Path(path_encrypted) cwd = path_encrypted.cwd() path_decrypted = cwd / 'decrypted' if not path_decrypted.exists(): path_decrypted.mkdir() path_decrypted /= path_encrypted.name path_decrypted.touch() if key_path is None: key_path = cwd / 'key' with path_encrypted.open('rt', encoding=encoding) as f1, key_path.open('rt', encoding=encoding) as f2, path_decrypted.open('wt', encoding=encoding) as f3: decrypted = decrypt(json.load(f1), json.load(f2)) f3.write(decrypted)
三、测试
将要加密的文件放到py文件同级目录下,运行以下将1.txt加密。
encrypt_file("D:/PyCharm Community Edition 2021.3.2/Workplace/encryption/1.txt")
将要解密的文件和密钥放到py文件同级目录下,运行以下将1.txt解密还原。
decrypt_file("D:/PyCharm Community Edition 2021.3.2/Workplace/encryption/1.txt")