我一直在使用pycrypto
和AES-256,并且在文件较大时遇到了一个问题。
对于小字符串,例如“ hello world!”,加密/解密工作正常。
但是我想将加密扩展到任何合理大小的文本文件,但是我一直遇到这个错误:
ValueError: Input strings must be a multiple of 16 in length
我知道这是因为AES-256是一种分组密码,因此文本必须以16字节的倍数表示,如果字节很大,则需要对它们进行分块。
我的问题是,我该怎么做呢?是否有内置的pycrypto
方法?我对密码学还很陌生,所以我认为我无法自己编写分块方法。
这是我填充/解压要加密的字符串的方法(来自https://gist.github.com/gustavohenrique/79cc95cc351d975a075f18a5c9f49319):
def pad(self, s):
return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)
def unpad(self, s):
return s[:-ord(s[len(s)-1:])]
这是Cipher
类的初始化方式:
def __init__(self, key):
self.bs = 16
self.cipher = AES.new(key, AES.MODE_ECB)
加密/解密:
def encrypt(self, raw):
raw = self._pad(raw)
encrypted = self.cipher.encrypt(raw)
encoded = base64.b64encode(encrypted)
return str(encoded, 'utf-8')
def decrypt(self, raw):
decoded = base64.b64decode(raw)
decrypted = self.cipher.decrypt(decoded)
return str(self._unpad(decrypted), 'utf-8')