使用pycrypto AES或其他算法解密中间数据块

3 投票
1 回答
1059 浏览
提问于 2025-04-17 07:00

我在找一种加密算法,想用pycrypto这个包来加密一大段原始数据,然后只解密其中的一部分。换句话说,就是从某个特定的位置开始解密,而不是从头开始。

我试过AES加密算法,如下所示。但它只允许我从加密数据的开头解密,直到我需要的那部分,而不能直接解密中间的一小段数据(当然需要用正确的密钥),也就是不能跳过前面的部分。这一点很重要,因为这样可以节省时间和计算资源。比如说,你有4GB的原始数据,但有时候你只需要3GB到3.5GB之间的数据。要是你为了获取这1GB的数据,先解密了整整2GB的数据,那就太浪费时间和资源了……

所有的加密/解密算法都是这样吗?你能推荐一些能满足我需求的算法吗?要求是要用密钥,并且安全性要高……

    from Crypto.Cipher import AES

key = '0123456789abcdef' #16 chars
mode = AES.MODE_CBC

e = AES.new(key, mode)

orig = 'hellohowareyousuhellohowareyousu' #32 chars
print len(orig)

a = e.encrypt(orig)
print len(a)

d = AES.new(key, mode)

#works
print d.decrypt(a[:16]) #aes requires encrypt/decrypt 16 chars at a time
print d.decrypt(a[16:])

#doesn't work
print d.decrypt(a[16:])

1 个回答

2

你正在使用 CBC(密码块链接) 模式。在这种模式下,消息会被分成一个个小块,而每一块的输出会被用来加密下一块。这种方式本质上是一个顺序操作;也就是说,要解密,你也必须按顺序处理密文。

如果你使用 CTR(计数器) 模式,你就可以随机访问。

撰写回答