在最近使用PyCrypto的一个项目中,我使用AES编写了自己的加密方法。我使用哈希来生成一个32字节的密码,并使用CBC将其输入到AES-256位加密。文件输入正在填充,使用PKCS#7填充以符合可被16整除的要求。
我可以不出意外地加密和解密文件,而最初加密的输入文件和输出文件具有相同的SHA-256哈希。
我发现的唯一问题是,如果我提供错误的密码,解密仍然会发生。这是我正在做的事情的一个问题,因为如果密码错误,我需要让解密快速失败。
我怎样才能做到这一点?我听说过其他AES加密方法,但似乎PyCrypto只支持ECB、CBC、CFB、OFB、CTR和OpenPGP。如何实现加密强AES,如果没有正确的密码短语,它将失败解密?
发布于 2013-02-20 20:12:47
AES (或任何其他加密算法)不能让您知道您是否拥有正确的密钥。也就是说,这是一个非常有用的特性,当你真的想要在数学领域之外使用密码学的时候。
您需要做的是在消息开始时添加一个具有已知值的块,这样,在解密第一个块之后,您可以将其与已知值进行比较,并知道您是否有错误的密钥。如果您正在加密的数据有一个已知的报头,您可以使用它。
或者,您可以发送密钥的密码散列(例如SHA-256)以及消息,只有当攻击者破坏哈希时才能恢复密钥。
发布于 2013-02-20 21:09:39
确保密文在更改后不会解密的最佳方法是添加身份验证标记。认证标签用于提供加密文本的认证和完整性。
该标记可以由密文上的MAC (例如AES-CMAC或使用SHA-256的HMAC )组成。然而,这需要第二个密钥才是安全的。
另一种方法是使用经过身份验证的加密,如GCM。GCM使用单个密钥并生成身份验证标记(大小可以配置)。
确保使用正确生成的IV。IV可以以密文为前缀,在计算身份验证标记时应该包括在内),并且不要忘记纯文本的大小可能不会被隐藏。
您应该在解密密文之前验证标记的正确性。
请注意,通常情况下,您不应该加密密码,除非您需要在稍后的某个日期访问确切的密码。要验证密码,请改用PBKDF2。
发布于 2013-02-21 01:25:15
要提供所需的快速失败属性,您将需要为正在加密的数据预置一个头。我建议使用随机的“混淆器”纳塞 (类似于加密盐)与已知的常量“幻数”连接;混淆器的存在就像盐一样,提供了一种防范基于预先计算表的攻击的措施。
有了这样的标题,您只需要破译标题并验证魔术数字字段;如果它与已知的常量不匹配,则键是不好的。如果匹配,则丢弃标头并处理输入的其余部分。
https://stackoverflow.com/questions/14988689
复制相似问题