python加密打包程序詳解
python加密打包程序
加密方式:將py文件轉(zhuǎn)為pyd格式
- 安裝easycython模塊 pip install easycython
- 使用easycython命令將py轉(zhuǎn)pyd: easycython xx.py, 會(huì)在同一目錄生成xx.pyd(如果是64位系統(tǒng)生成的文件名為xx.cp36-win_amd64.pyd);
- 將xx.cp36-win_amd64.pyd重命名為xx.pyd;
- 使用pyinstaller打包(由于xx.py和xx.pyd在同一目錄, pyinstaller會(huì)優(yōu)先打包pyd), 打包時(shí)添加—hidden-import xx選項(xiàng).
- 生成的打包文件中會(huì)包含xx.pyd;
- 注意: 如果打包時(shí)使用了—key選項(xiàng), 但打包的模塊是pyd格式的, 則pyd文件不會(huì)被加密, 只是打包
打包腳本:
打包參數(shù)說(shuō)明:
- -F:僅僅生成一個(gè)文件,不暴露其他信息,啟動(dòng)較慢。
- -D:生成一個(gè)文件夾,里面是多文件模式,啟動(dòng)快。
- -w:窗口模式打包,不顯示控制臺(tái)。
示例
pyinstaller -F -w -i logo.ico python_file1.py python_file2.py python_file3.py
補(bǔ)充:Python實(shí)現(xiàn)文件簡(jiǎn)單加解密
一、基礎(chǔ)知識(shí)
python中的異或操作符為 ^ ,也記作XOR,按位異或的結(jié)果是:值相同時(shí)異或?yàn)?,值不同時(shí)異或?yàn)?,一共有四種情況:0 ^ 0 = 0,0 ^ 1 = 1,1 ^ 0 = 1,1 ^ 1 = 0,使用異或可以對(duì)文件進(jìn)行簡(jiǎn)單的加解密操作。
加密操作:首先將文件轉(zhuǎn)換為二進(jìn)制數(shù),再隨機(jī)生成一個(gè)與該二進(jìn)制等長(zhǎng)的密鑰,將文件的二進(jìn)制數(shù)與密鑰進(jìn)行異或操作,就能得到加密后的二進(jìn)制數(shù),存儲(chǔ)為加密文件。
解密操作:將加密后的二進(jìn)制文件與密鑰再進(jìn)行異或操作,就能得到原二進(jìn)制數(shù),再將原二進(jìn)制數(shù)恢復(fù)成文件。
二、加解密算法
1.導(dǎo)入運(yùn)行庫(kù)
import json from pathlib import Path from secrets import token_bytes import argparse
2.定義生成密鑰函數(shù)
def random_key(length): key = token_bytes(nbytes=length) #根據(jù)指定長(zhǎng)度生成隨機(jī)密鑰 key_int = int.from_bytes(key, 'big') #將byte轉(zhuǎn)換為int return key_int
3.定義加解密單元
def encrypt(raw): #加密單元 raw_bytes = raw.encode() #將字符串編碼成字節(jié)串 raw_int = int.from_bytes(raw_bytes, 'big') #將byte轉(zhuǎn)換成int key_int = random_key(len(raw_bytes)) #根據(jù)長(zhǎng)度生成密鑰 return raw_int ^ key_int, key_int #將密鑰與文件異或,返回異或后的結(jié)果和密鑰 def decrypt(encrypted, key_int): #解密單元 decrypted = encrypted ^ key_int #將加密后的文件與密鑰異或 length = (decrypted.bit_length() + 7) // 8 #計(jì)算所占比特大小 decrypted_bytes = int.to_bytes(decrypted, length, 'big') #將int轉(zhuǎn)換回byte return decrypted_bytes.decode() #解碼后返回
4.加密文件
def encrypt_file(path, key_path=None, *, encoding='utf-8'): #參數(shù)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() //打開(kāi)文件并將內(nèi)容寫(xiě)入 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)
三、測(cè)試
將要加密的文件放到py文件同級(jí)目錄下,運(yùn)行以下將1.txt加密。
encrypt_file("D:/PyCharm Community Edition 2021.3.2/Workplace/encryption/1.txt")
將要解密的文件和密鑰放到py文件同級(jí)目錄下,運(yùn)行以下將1.txt解密還原。
decrypt_file("D:/PyCharm Community Edition 2021.3.2/Workplace/encryption/1.txt")
到此這篇關(guān)于python加密打包程序的文章就介紹到這了,更多相關(guān)python加密打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
NumPy之矩陣向量線(xiàn)性代數(shù)等操作示例
這篇文章主要為大家介紹了NumPy之矩陣向量線(xiàn)性代數(shù)等操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04用TensorFlow實(shí)現(xiàn)戴明回歸算法的示例
這篇文章主要介紹了用TensorFlow實(shí)現(xiàn)戴明回歸算法的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05詳解Python map函數(shù)及Python map()函數(shù)的用法
map() 會(huì)根據(jù)提供的函數(shù)對(duì)指定序列做映射。下面通過(guò)本文給大家介紹Python map函數(shù)及Python map()函數(shù)的用法,需要的朋友參考下吧2017-11-11python通過(guò)zlib實(shí)現(xiàn)壓縮與解壓字符串的方法
這篇文章主要介紹了python通過(guò)zlib實(shí)現(xiàn)壓縮與解壓字符串的方法,較為詳細(xì)的介紹了zlib的用法及使用zlib.compressobj和zlib.decompressobj對(duì)文件進(jìn)行壓縮解壓的方法,需要的朋友可以參考下2014-11-11wxPython中l(wèi)istbox用法實(shí)例詳解
這篇文章主要介紹了wxPython中l(wèi)istbox用法,以實(shí)例形式較為詳細(xì)的分析了Python使用wxPython中l(wèi)istbox的相關(guān)技巧,需要的朋友可以參考下2015-06-06使用Django實(shí)現(xiàn)文章與多個(gè)標(biāo)簽關(guān)聯(lián)的示例詳解
在構(gòu)建一個(gè)博客或內(nèi)容管理系統(tǒng)時(shí),經(jīng)常需要實(shí)現(xiàn)文章與標(biāo)簽的關(guān)聯(lián),在 Django 中,我們可以利用 ManyToManyField 來(lái)實(shí)現(xiàn)文章與標(biāo)簽的多對(duì)多關(guān)系,在本文中,我們將詳細(xì)探討如何使用 Django 模型實(shí)現(xiàn)文章與多個(gè)標(biāo)簽的關(guān)聯(lián),需要的朋友可以參考下2023-11-11