Python加密word文檔詳解
Python加密word文檔
我們先瞭解一下異或是什麼。簡單來說,如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。我們簡單的梳理一下代碼思路。代碼分為兩部分,加密和解密。
1.加密
把文件轉換成二進制的格式,然後生成等長的隨機密鑰進行異或操作,得到加密後的二進制文件。這一步我們需要保留的數據有,加密後的文件和隨機生成的密鑰,當然他們都是一些二進制數。
2.解密
這一步就簡單瞭,我們把加密後的文件和之前隨機生成的密鑰再進行一次異或操作,即可得到原本的二進制數,然後我們再把它轉換成文本即可。
OK,思路大致明瞭瞭,我們需要兩個程序,加密程序接收str參數 ,運行完成會輸出加密後的二進制word文檔,和用於解密的二進制密鑰。解密程序則需要接收兩個int參數,分別為加密程序輸出的兩個二進制內容,異或之後輸出原始文本。那麼,上代碼。
加密代碼:
from secrets import token_bytes from docx import Document import docx import time def random_key(length): # token_bytes,函數接受一個int參數,用於指定隨機字節串的長度。 # int.from_bytes把字節串轉換為int,也就是我們需要的二進制數 key = token_bytes(nbytes=length) key_int = int.from_bytes(key, 'big') return key_int def encrypt(raw): raw_bytes = raw.encode() #參數big意為正序,little則輸出反序。 raw_int = int.from_bytes(raw_bytes, 'big') 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') return decrypted_bytes.decode() def encrypt_file(path, key_path=None,): document = Document(path) all_paragraphs = document.paragraphs file = docx.Document() file2 = docx.Document() jkl = input('請輸入希望保存的文件名:') + '.docx' for paragraph in all_paragraphs: # 打印每一個段落的文字 zz,key = encrypt(paragraph.text) #print('加密:',zz) #print('key:', key) file.add_paragraph(str(zz)) file.save(jkl) file2.add_paragraph(str(key)) file2.save("key.docx") print('滑稽研究所出品!') print('僅支持英文文件名。') chenggong = encrypt_file(input('請輸入需要加密的文件名:')) print("已完成!十秒後自動關閉") time.sleep(10) #生成加密文件
通過 encode 方法,將字符串編碼成字節串。int.from_bytes 函數將字節串轉換為 int 對象。最後對二進制對象和隨機密鑰進行異或操作,就得到瞭加密文本。
解密代碼:
from secrets import token_bytes from docx import Document import docx import time def random_key(length): # token_bytes,函數接受一個int參數,用於指定隨機字節串的長度。 # int.from_bytes把字節串轉換為int,也就是我們需要的二進制數 key = token_bytes(nbytes=length) key_int = int.from_bytes(key, 'big') return key_int def encrypt(raw): raw_bytes = raw.encode() raw_int = int.from_bytes(raw_bytes, 'big') 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') return decrypted_bytes.decode() jjj = [] kkk = [] def decrypt_file(path_encrypted, key_path=None, *, encoding='utf-8'): document = Document(path_encrypted) all_paragraphs = document.paragraphs do2 = Document('key.docx') all_p= do2.paragraphs for i in all_paragraphs: #str轉int jiam = int(i.text) jjj.append(jiam) #print('加密:',jiam) #print(jjj) for k in all_p: #str轉int key = int(k.text) kkk.append(key) #print('key:',key) #print(kkk) cc = zip(jjj,kkk) res = list(cc) return res #傳入元組,或兩個int。 print('滑稽研究所出品!') print('警告,嚴禁修改密鑰文件名!!!') print('直接輸入文件名,無需格式後綴。') rr1 = decrypt_file(input("請輸入需要破解文件的文件名(僅限.docx文件):")+'.docx') file = docx.Document() for i in rr1: ff = decrypt(*i) #print(ff) #print(type(ff)) file.add_paragraph(ff) file.save("res.docx") print('解密完成,請在當前文件夾下提取文件!') print('十秒後自動關閉!') time.sleep(10)
我們需要將兩個程序打包成exe。運行加密程序得到的二進制word文檔,可以給其他人,但密鑰必須自己保存。當別人滿足你的要求之後,我們可以把密鑰和解密程序給他。註意,隻對docx文件有效,且不可以修改密鑰文件的名稱,不然會報錯,解密失敗。
運行結果:
原始word文件。
加密後:
生成的key密鑰:
加密後的文件和生成的密鑰,放在解密程序文件夾下之後,會得到如下。我們得到瞭原文件,美中不足的是所有的首行縮進都消失瞭,變成瞭左對齊。
同樣的文件,重新加密之後,會得到不同的加密文件和密鑰。因此如果加密文件和密鑰不匹配,即使他們的源文件是一樣的,也是無法解密的。此外密鑰丟失,加密的文件將永遠不能解密。
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- Python快速優雅的批量修改Word文檔樣式
- python提取word文件中的圖片並上傳阿裡雲OSS
- Python 讀取 Word 文檔操作
- Python 常見加密操作的實現
- Python教程自己實現軟件加密功能