pycrypto加密和解密很慢

时间:2014-02-04 20:50:01

标签: python-2.7 cryptography pycrypto

实际上,我选择了一个可执行文件。 大小20Mb

我使用file.read(size=16)阅读了内容。

如果返回的字节字符串的长度小于16,则用\0 (NULL)填充其余部分。

f = open("./installer.exe","rb")

obj = AES.new(b"0123456789012345",AES.MODE_CBC, b"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")

bs = b""
t = f.read(16)
while t != b"":
    if len(t) < 16:
        t = t + b"\0" * (16 - len(t)) # if < 16 bytes using padding
        bs = bs + obj.encrypt(t)
    else:
        bs = bs + obj.encrypt(t)
    t = f.read(16)

然后, bs 会内容使用 0123456789012345 加密的所有内容的字节字符串

我首先意识到读取文件的机制,然后我加密内容,如上面的代码片段所示(使用obj.encrypt())。然后我写了一个加密内容的新文件。我读了加密文件的数据,并通过类似的程序使用 obj.decrypt 以16个字节的间隔解密数据,然后我用解密的数据写一个新文件

大约需要3分钟

¿它快速,缓慢还是预期?

根据我所看到的,该模块是用C编写的。也许我应该使用Cython嵌入式来加快速度?

PGP如何实时解密更多数据(例如,在加密的虚拟磁盘中)?

修改

这几乎相同:

obj = AES.new(b"0123456789012345",AES.MODE_CBC, b"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")

bs = b""
t = f.read(16)
while t != b"":
    if len(t) < 16:
        t = t + b"\0" * (16 - len(t))
        bs = bs + t
    else:
        bs = bs + t
    t = f.read(16)

bse = obj.encrypt(bs)

1 个答案:

答案 0 :(得分:0)

确定。问题是加密缓冲区的大小。我决定使用64000字节的字符串。

程序很简单。 总大小/字符串细分 - &gt;加密。在最后一段中,如果段的大小低于64000而不是16的倍数,则找到最接近的倍数并填充剩余空间

bs = b""
dt = f.read()
dtl = len(dt)
dtr = ( dtl / 64000 ) + 1

for x in range(0, dtr):
    if x == dtr-1:
        i1 = 64000 * x
        dst = dtl - i1
        i = math.ceil(dst / 16.0) * 16
        dst = i - dst
        buf = dt[i1:] + (b"\0" * int(dst))
        bs = bs + obj.encrypt(buf)
    else:
        i1, i2 = 64000 * x ,  64000 * (x+1)
        bs = bs + obj.encrypt(dt[i1:i2])

现在需要10秒钟。 谢谢大家。