• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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密钥:

    加密后的文件和生成的密钥,放在解密程序文件夹下之后,会得到如下。我们得到了原文件,美中不足的是所有的首行缩进都消失了,变成了左对齐。


    同样的文件,重新加密之后,会得到不同的加密文件和密钥。因此如果加密文件和密钥不匹配,即使他们的源文件是一样的,也是无法解密的。此外密钥丢失,加密的文件将永远不能解密。

    总结

    本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

    您可能感兴趣的文章:
    • Python快速优雅的批量修改Word文档样式
    • 教你如何利用Python批量翻译英文Word文档并保留格式
    • Python实现对word文档添加密码去除密码的示例代码
    • Python实现Word文档转换Markdown的示例
    • python3处理word文档实例分析
    上一篇:昨晚我用python帮隔壁小姐姐P证件照然后发现
    下一篇:python之多种方式传递函数方法案例讲解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python加密word文档详解 Python,加密,word,文档,详解,