|

楼主 |
发表于 2022-4-5 20:56:50
|
显示全部楼层
本帖最后由 王诗琪 于 2022-4-5 21:02 编辑
任意加解密一个word文档
运行环境:python3.7.9
库:Crypto,docx
加密:
首先我们建立一个待加密文档,直接放在E盘目录下:
文档内容:
用encode.py加密文档,代码如下:- from Crypto.Cipher import AES
- from binascii import b2a_hex, a2b_hex
- from docx import Document
- # 加密函数
- def encrypt(text):
- key = 'wangshiqi1234567'.encode('utf-8')
- mode = AES.MODE_ECB
- text = add_to_16(text)
- cryptos = AES.new(key, mode)
- cipher_text = cryptos.encrypt(text)
- return b2a_hex(cipher_text)
- def encode():
- arr = [] # 保存加密密文
- # 创建文档对象
- document = Document('e:/待加密文档.docx')
- # 读取文档中所有的段落列表
- ps = document.paragraphs
- # 每个段落有两个属性:style和text
- ps_detail = [(x.text, x.style.name) for x in ps]
- for i, j in ps_detail:
- arr.append(encrypt(i))
- return arr # 元素类型为byte型
- def add_to_16(text):
- if len(text.encode('utf-8')) % 16:
- add = 16 - (len(text.encode('utf-8')) % 16)
- else:
- add = 0
- text = text + ('\0' * add)
- return text.encode('utf-8')
- def output(arr1):
- # 创建文档对象
- document = Document()
- # 往文档中添加段落
- for i in arr1:
- p = document.add_paragraph(str(i))
- # 保存文档
- document.save('e:/加密文档.docx')
- if __name__ == '__main__':
- arr = encode() # 加密
- output(arr)
- print("加密成功。")
复制代码
运行结果:
此时e盘中多了一个加密文档.docx,内容如下:
解密:
出于方便,这里我直接取上述加密文件过程中得到的加密密文进行解密。
用decode.py解密文档,代码如下:- from Crypto.Cipher import AES
- from binascii import b2a_hex, a2b_hex
- from docx import Document
- import encode
- def decrypt(text):
- key = 'wangshiqi1234567'.encode('utf-8')
- mode = AES.MODE_ECB
- cryptor = AES.new(key, mode)
- plain_text = cryptor.decrypt(a2b_hex(text))
- return bytes.decode(plain_text).rstrip('\0')
- def decode(arr):
- tmp = []
- for i in arr:
- tmp.append(decrypt(i))
- return tmp
- def output(tmp):
- # 创建文档对象
- document = Document()
- # 往文档中添加段落
- for i in tmp:
- p = document.add_paragraph(str(i))
- # 保存文档
- document.save('e:/解密文档.docx')
- if __name__ == '__main__':
- arr1 = encode.encode() # 使用前一个待加密文档的密文进行解密
- tmp1 = decode(arr1) # 解密
- output(tmp1) # 将解密文档保存为word文档
- print("解密成功。")
复制代码
运行结果:
此时就可以在e盘中得到一个解密文档.docx,内容如下:
可以看出解密内容与待加密文档内容一致,因此以上代码可以成功执行并得到正确结果。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|