python加密打包程序详解

作者:你的破壁人呀 时间:2021-03-02 02:02:46 

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")

python加密打包程序详解

 将要解密的文件和密钥放到py文件同级目录下,运行以下将1.txt解密还原。

decrypt_file("D:/PyCharm Community Edition 2021.3.2/Workplace/encryption/1.txt")

python加密打包程序详解

来源:https://blog.csdn.net/sinat_36564972/article/details/129975748

标签:python,加密,打包,加解密
0
投稿

猜你喜欢

  • ASP代码中的容错机制

    2008-10-19 17:30:00
  • 基于并发服务器几种实现方法(总结)

    2021-12-30 16:18:09
  • Python面向对象之私有属性和私有方法应用案例分析

    2021-08-19 07:08:29
  • 微信小程序 云开发模糊查询实现解析

    2023-08-24 14:47:57
  • 奇淫技巧和西天取经

    2009-08-24 12:34:00
  • 基于Python实现千图成像工具的示例代码

    2022-03-14 12:19:21
  • asp自带的内存缓存 application

    2011-03-09 11:18:00
  • 从django的中间件直接返回请求的方法

    2022-02-04 23:32:23
  • Django 博客实现简单的全文搜索的示例代码

    2023-12-07 10:09:19
  • MYSQL教程:my.cnf缓存优化

    2009-07-30 08:58:00
  • 教你轻松解决几种常见的SQL疑难问题

    2009-01-07 14:25:00
  • PHP convert_uudecode()函数讲解

    2023-06-12 15:53:51
  • js substr、substring和slice使用说明小记

    2023-07-15 16:26:03
  • 文字解说Golang Goroutine和线程的区别

    2023-10-15 18:56:36
  • 如何取得MYSQL中ENUM列的全部可能值

    2009-07-30 08:53:00
  • Python内置函数 next的具体使用方法

    2023-09-30 18:42:28
  • 详解Python中for循环是如何工作的

    2021-07-04 17:41:40
  • python 使用OpenCV进行简单的人像分割与合成

    2021-06-16 20:46:39
  • php牛逼的面试题分享

    2023-11-20 19:31:35
  • Python3网络爬虫开发实战之极验滑动验证码的识别

    2022-10-02 22:06:14
  • asp之家 网络编程 m.aspxhome.com