教学服务系统

 找回密码
 立即注册
搜索
查看: 594|回复: 1

信息计算2019级2班32号王诗琪

[复制链接]

8

主题

16

帖子

114

积分

注册会员

Rank: 2

积分
114
发表于 2022-4-5 20:31:16 | 显示全部楼层 |阅读模式
观看截图:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

16

帖子

114

积分

注册会员

Rank: 2

积分
114
 楼主| 发表于 2022-4-5 20:56:50 | 显示全部楼层
本帖最后由 王诗琪 于 2022-4-5 21:02 编辑

任意加解密一个word文档

运行环境:python3.7.9
库:Crypto,docx


加密:

首先我们建立一个待加密文档,直接放在E盘目录下:

文档内容:

用encode.py加密文档,代码如下:
  1. from Crypto.Cipher import AES
  2. from binascii import b2a_hex, a2b_hex
  3. from docx import Document


  4. # 加密函数
  5. def encrypt(text):
  6.     key = 'wangshiqi1234567'.encode('utf-8')
  7.     mode = AES.MODE_ECB
  8.     text = add_to_16(text)
  9.     cryptos = AES.new(key, mode)
  10.     cipher_text = cryptos.encrypt(text)
  11.     return b2a_hex(cipher_text)


  12. def encode():
  13.     arr = []  # 保存加密密文
  14.     # 创建文档对象
  15.     document = Document('e:/待加密文档.docx')
  16.     # 读取文档中所有的段落列表
  17.     ps = document.paragraphs
  18.     # 每个段落有两个属性:style和text
  19.     ps_detail = [(x.text, x.style.name) for x in ps]
  20.     for i, j in ps_detail:
  21.         arr.append(encrypt(i))
  22.     return arr  # 元素类型为byte型


  23. def add_to_16(text):
  24.     if len(text.encode('utf-8')) % 16:
  25.         add = 16 - (len(text.encode('utf-8')) % 16)
  26.     else:
  27.         add = 0
  28.     text = text + ('\0' * add)
  29.     return text.encode('utf-8')


  30. def output(arr1):
  31.     # 创建文档对象
  32.     document = Document()
  33.     # 往文档中添加段落
  34.     for i in arr1:
  35.         p = document.add_paragraph(str(i))

  36.     # 保存文档
  37.     document.save('e:/加密文档.docx')


  38. if __name__ == '__main__':
  39.     arr = encode()  # 加密
  40.     output(arr)
  41.     print("加密成功。")
复制代码

运行结果:

此时e盘中多了一个加密文档.docx,内容如下:


解密:
出于方便,这里我直接取上述加密文件过程中得到的加密密文进行解密。
用decode.py解密文档,代码如下:
  1. from Crypto.Cipher import AES
  2. from binascii import b2a_hex, a2b_hex
  3. from docx import Document
  4. import encode


  5. def decrypt(text):
  6.     key = 'wangshiqi1234567'.encode('utf-8')
  7.     mode = AES.MODE_ECB
  8.     cryptor = AES.new(key, mode)
  9.     plain_text = cryptor.decrypt(a2b_hex(text))
  10.     return bytes.decode(plain_text).rstrip('\0')


  11. def decode(arr):
  12.     tmp = []
  13.     for i in arr:
  14.         tmp.append(decrypt(i))
  15.     return tmp


  16. def output(tmp):
  17.     # 创建文档对象
  18.     document = Document()
  19.     # 往文档中添加段落
  20.     for i in tmp:
  21.         p = document.add_paragraph(str(i))

  22.     # 保存文档
  23.     document.save('e:/解密文档.docx')


  24. if __name__ == '__main__':
  25.     arr1 = encode.encode()  # 使用前一个待加密文档的密文进行解密
  26.     tmp1 = decode(arr1)  # 解密
  27.     output(tmp1)  # 将解密文档保存为word文档
  28.     print("解密成功。")
复制代码

运行结果:

此时就可以在e盘中得到一个解密文档.docx,内容如下:

可以看出解密内容与待加密文档内容一致,因此以上代码可以成功执行并得到正确结果。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

教学服务系统

GMT+8, 2025-5-6 10:28 , Processed in 0.014476 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表