最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python加密word文檔詳解

 更新時(shí)間:2021年08月19日 17:12:24   作者:滑稽研究所  
這篇文章主要介紹了Python實(shí)現(xiàn)對word文檔添加密碼去除密碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Python加密word文檔

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

1.加密

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

2.解密

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

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

加密代碼:

from secrets import token_bytes
from docx import Document
import docx
import time
​
def random_key(length):
    # token_bytes,函數(shù)接受一個(gè)int參數(shù),用于指定隨機(jī)字節(jié)串的長度。
    # int.from_bytes把字節(jié)串轉(zhuǎn)換為int,也就是我們需要的二進(jìn)制數(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:
        # 打印每一個(gè)段落的文字
        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("已完成!十秒后自動(dòng)關(guān)閉")
time.sleep(10)
#生成加密文件

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

解密代碼:

from secrets import token_bytes
from docx import Document
import docx
import time
​
def random_key(length):
    # token_bytes,函數(shù)接受一個(gè)int參數(shù),用于指定隨機(jī)字節(jié)串的長度。
    # int.from_bytes把字節(jié)串轉(zhuǎn)換為int,也就是我們需要的二進(jìn)制數(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
#傳入元組,或兩個(gè)int。
print('滑稽研究所出品!')
print('警告,嚴(yán)禁修改密鑰文件名?。。?)
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('解密完成,請?jiān)诋?dāng)前文件夾下提取文件!')
print('十秒后自動(dòng)關(guān)閉!')
time.sleep(10)

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

運(yùn)行結(jié)果:

原始word文件。

在這里插入圖片描述

加密后:

在這里插入圖片描述

生成的key密鑰:

在這里插入圖片描述

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

在這里插入圖片描述

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

總結(jié)

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

相關(guān)文章

  • Python3.x+迅雷x 自動(dòng)下載高分電影的實(shí)現(xiàn)方法

    Python3.x+迅雷x 自動(dòng)下載高分電影的實(shí)現(xiàn)方法

    這篇文章主要介紹了Python3.x+迅雷x 自動(dòng)下載高分電影的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Python實(shí)現(xiàn)的求解最小公倍數(shù)算法示例

    Python實(shí)現(xiàn)的求解最小公倍數(shù)算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的求解最小公倍數(shù)算法,涉及Python數(shù)值運(yùn)算、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • python通過paramiko復(fù)制遠(yuǎn)程文件及文件目錄到本地

    python通過paramiko復(fù)制遠(yuǎn)程文件及文件目錄到本地

    這篇文章主要為大家詳細(xì)介紹了python通過paramiko復(fù)制遠(yuǎn)程文件及文件目錄到本地,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • python結(jié)合opencv實(shí)現(xiàn)人臉檢測與跟蹤

    python結(jié)合opencv實(shí)現(xiàn)人臉檢測與跟蹤

    在Python下用起來OpenCV很爽,代碼很簡潔,很清晰易懂。使用的是Haar特征的分類器,訓(xùn)練之后得到的數(shù)據(jù)存在一個(gè)xml中。下面我們就來詳細(xì)談?wù)劇?/div> 2015-06-06
  • Python capitalize()函數(shù)的用法詳解

    Python capitalize()函數(shù)的用法詳解

    在Python中,capitalize()將字符串的第一個(gè)字符轉(zhuǎn)換為大寫字母,并將所有其他字符(如果有的話)轉(zhuǎn)換為小寫,本文就將給大家介紹一下Python capitalize()函數(shù)的使用方法,感興趣的朋友跟著小編一起來看看吧
    2023-07-07
  • python操作yaml說明

    python操作yaml說明

    這篇文章主要介紹了python操作yaml說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 解決Python內(nèi)層for循環(huán)如何break出外層的循環(huán)的問題

    解決Python內(nèi)層for循環(huán)如何break出外層的循環(huán)的問題

    今天小編就為大家分享一篇解決Python內(nèi)層for循環(huán)如何break出外層的循環(huán)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python開發(fā)微信公眾平臺的方法詳解【基于weixin-knife】

    Python開發(fā)微信公眾平臺的方法詳解【基于weixin-knife】

    這篇文章主要介紹了Python開發(fā)微信公眾平臺的方法,結(jié)合實(shí)例形式分析了Python基于weixin-knife針對微信公眾平臺消息、接口調(diào)用及事件處理的基本操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-07-07
  • Python實(shí)現(xiàn)Canny及Hough算法代碼實(shí)例解析

    Python實(shí)現(xiàn)Canny及Hough算法代碼實(shí)例解析

    這篇文章主要介紹了Python實(shí)現(xiàn)Canny與Hough算法代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • python音頻處理用到的操作的示例代碼

    python音頻處理用到的操作的示例代碼

    本篇文章主要介紹了python音頻處理用到的操作的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

施甸县| 新河县| 酒泉市| 朝阳市| 册亨县| 蒙城县| 调兵山市| 永州市| 张家港市| 宁蒗| 江阴市| 莆田市| 哈尔滨市| 淮阳县| 遂平县| 大荔县| 赞皇县| 新丰县| 兖州市| 调兵山市| 佛坪县| 柘荣县| 鄂伦春自治旗| 凤庆县| 新晃| 自治县| 马公市| 武乡县| 汝南县| 法库县| 楚雄市| 手机| 平陆县| 赣榆县| 犍为县| 邢台县| 明水县| 深水埗区| 保德县| 青川县| 社会|