我尝试使用PyCrypto构建两个函数,接受两个参数:消息和密钥,然后对消息进行加密/解密。
我在网上找到了几个帮助我的链接,但每个链接都有缺陷:
This one at codekoala使用os.urandom,PyCrypto不鼓励这样做。
此外,我给函数的键不能保证有预期的确切长度。我该怎么做才能做到?
另外,有几种模式,推荐哪一种?我不知道该用什么:
最后,静脉注射到底是什么?我可以为加密和解密提供一个不同的IV吗,或者这将返回一个不同的结果?
我到目前为止所做的是:
from Crypto import Random
from Crypto.Cipher import AES
import base64
BLOCK_SIZE=32
def encrypt(message, passphrase):
# passphrase MUST be 16, 24 or 32 bytes long, how can I do that ?
IV = Random.new().read(BLOCK_SIZE)
aes = AES.new(passphrase, AES.MODE_CFB, IV)
return base64.b64encode(aes.encrypt(message))
def decrypt(encrypted, passphrase):
IV = Random.new().read(BLOCK_SIZE)
aes = AES.new(passphrase, AES.MODE_CFB, IV)
return aes.decrypt(base64.b64decode(encrypted))
下面是我的实现,它对我起到了一些修复作用,并增强了密钥和机密短语与32字节和iv到16字节的对齐:
让我来回答你关于“模式”的问题。AES256是一种分组密码。它接受一个32字节的键和一个16字节的字符串,称为块并输出一个块。我们在操作模式下使用AES来加密。上面的解决方案建议使用CBC,这是一个例子。另一种称为CTR,使用起来比较容易:
这通常被称为AES-CTR。我建议谨慎使用AES-CBC和PyCrypto。原因是它要求您指定填充方案,如给出的其他解决方案所示。一般来说,如果你对填充不太小心,就会有完全破坏加密的attacks!
现在,需要注意的是,密钥必须是一个随机的32字节字符串;密码不够。通常,密钥的生成方式如下:
密钥也可以从密码中导出:
上面的一些解决方案建议使用SHA256来派生密钥,但这通常被认为是bad cryptographic practice。 查看wikipedia了解有关操作模式的更多信息。
当输入长度不是块大小的倍数时,您可能需要以下两个函数来填充(加密时)和取消填充(解密时)。
所以你问钥匙的长度?您可以使用密钥的md5sum,而不是直接使用它。
此外,根据我使用PyCrypto的一点经验,当输入相同时,IV用于混合加密的输出,因此选择IV作为随机字符串,并将其用作加密输出的一部分,然后使用它来解密消息。
下面是我的实现,希望对你有用:
相关问题 更多 >
编程相关推荐