Pyocrypt DES3 文件加密解密缺失文本部分

2 投票
1 回答
1232 浏览
提问于 2025-04-17 14:48

我在用Python做3DES加密,参考了这个博客(在“应用”这个部分),用的是Crypto库。我在测试一个叫有趣文件树的项目,作为例子,我用的文件是《一个会计和他的青蛙.txt》,还有很多其他文件(文件大小差别很大,比如TOASTERS)。

pyencrypt

import os
from Crypto.Cipher import DES3

def encrypt_file(in_filename, out_filename, chunk_size, key, iv):
    des3 = DES3.new(key, DES3.MODE_CFB, iv)
    with open(in_filename, 'r') as in_file:
        with open(out_filename, 'w') as out_file:
            while True:
                chunk = in_file.read(chunk_size)
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    chunk += ' ' * (16 - len(chunk) % 16)
                out_file.write(des3.encrypt(chunk))

def decrypt_file(in_filename, out_filename, chunk_size, key, iv):
    des3 = DES3.new(key, DES3.MODE_CFB, iv)

    with open(in_filename, 'r') as in_file:
        with open(out_filename, 'w') as out_file:
            while True:
                chunk = in_file.read(chunk_size)
                if len(chunk) == 0:
                    break
                out_file.write(des3.decrypt(chunk))

使用方法

import pyencrypt, md5
from Crypto import Random
iv = Random.get_random_bytes(8)
m = md5.new()
m.update("encryptionkey")
key =  m.digest()
.encrypt_file("C:\\treeoffunfiles\\Accountant and his frog.txt", 'C:\\treeoffun\\to_enc.enc', 8192, key, iv)
pyencrypt.decrypt_file('C:\\treeoffunfiles\\to_enc.enc', 'C:\\treeoffunfiles\\to_enc.dec', 8192, key, iv)

文件加密效果很好(没有任何问题)!但是文件的解密效果就不太好了。这是一个比较,显示了原文件和解密后文件的差异,使用的是notepad++

notepad++
(来源: iforce.co.nz)

有没有人知道为什么解密后的文件缺少了原文件的内容?我该如何让解密(如果需要的话,加密也)更准确一些,尤其是对于那些大小可能不同的文件?

1 个回答

1

这个建议的回答是由DSM在评论中发的(我一直在等他发正式的回答,所以这个可以暂时保留)。

这个方法对我有效,但我不是在Windows上。你能试试以二进制模式打开文件(“rb”/“wb”)吗?看看这样是否有帮助? – DSM

问题在于,最初的3DES加密是在一个unix机器上运行的,而在windows系统上的结果却不一样。

为了修复缺失的数据块,DSM建议将文件的输入/输出改为二进制模式,而不是常规的读取/写入,这样就得到了想要的结果,具体可以在这里查看。

顺便说一下,diffnow只会保存结果一个月。

撰写回答