使用pycrypto AES或其他算法解密中间数据块
我在找一种加密算法,想用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(计数器) 模式,你就可以随机访问。