人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

Python加密word文檔詳解

發(fā)布日期:2022-02-08 13:17 | 文章來源:gibhub

Python加密word文檔

我們先了解一下異或是什么。簡單來說,如果a、b兩個值不相同,則異或結(jié)果為1。如果a、b兩個值相同,異或結(jié)果為0。我們簡單的梳理一下代碼思路。代碼分為兩部分,加密和解密。

1.加密

把文件轉(zhuǎn)換成二進制的格式,然后生成等長的隨機密鑰進行異或操作,得到加密后的二進制文件。這一步我們需要保留的數(shù)據(jù)有,加密后的文件和隨機生成的密鑰,當然他們都是一些二進制數(shù)。

2.解密

這一步就簡單了,我們把加密后的文件和之前隨機生成的密鑰再進行一次異或操作,即可得到原本的二進制數(shù),然后我們再把它轉(zhuǎn)換成文本即可。

OK,思路大致明了了,我們需要兩個程序,加密程序接收str參數(shù) ,運行完成會輸出加密后的二進制word文檔,和用于解密的二進制密鑰。解密程序則需要接收兩個int參數(shù),分別為加密程序輸出的兩個二進制內(nèi)容,異或之后輸出原始文本。那么,上代碼。

加密代碼:

from secrets import token_bytes
from docx import Document
import docx
import time
​
def random_key(length):
 # token_bytes,函數(shù)接受一個int參數(shù),用于指定隨機字節(jié)串的長度。
 # int.from_bytes把字節(jié)串轉(zhuǎn)換為int,也就是我們需要的二進制數(shù)
 key = token_bytes(nbytes=length)
 key_int = int.from_bytes(key, 'big')
 return key_int
​
def encrypt(raw):
 raw_bytes = raw.encode()
 #參數(shù)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("已完成!十秒后自動關(guān)閉")
time.sleep(10)
#生成加密文件

通過 encode 方法,將字符串編碼成字節(jié)串。int.from_bytes 函數(shù)將字節(jié)串轉(zhuǎn)換為 int 對象。最后對二進制對象和隨機密鑰進行異或操作,就得到了加密文本。

解密代碼:

from secrets import token_bytes
from docx import Document
import docx
import time
​
def random_key(length):
 # token_bytes,函數(shù)接受一個int參數(shù),用于指定隨機字節(jié)串的長度。
 # int.from_bytes把字節(jié)串轉(zhuǎn)換為int,也就是我們需要的二進制數(shù)
 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轉(zhuǎn)int
  jiam = int(i.text)
  jjj.append(jiam)
​
  #print('加密:',jiam)
 #print(jjj)
​
 for k in all_p:
  #str轉(zhuǎn)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('十秒后自動關(guān)閉!')
time.sleep(10)

我們需要將兩個程序打包成exe。運行加密程序得到的二進制word文檔,可以給其他人,但密鑰必須自己保存。當別人滿足你的要求之后,我們可以把密鑰和解密程序給他。注意,只對docx文件有效,且不可以修改密鑰文件的名稱,不然會報錯,解密失敗。

運行結(jié)果:

原始word文件。


加密后:


生成的key密鑰:

加密后的文件和生成的密鑰,放在解密程序文件夾下之后,會得到如下。我們得到了原文件,美中不足的是所有的首行縮進都消失了,變成了左對齊。


同樣的文件,重新加密之后,會得到不同的加密文件和密鑰。因此如果加密文件和密鑰不匹配,即使他們的源文件是一樣的,也是無法解密的。此外密鑰丟失,加密的文件將永遠不能解密。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注本站的更多內(nèi)容!

國外服務(wù)器租用

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部