Python 如果密码无效,则使AES解密失败

Python 如果密码无效,则使AES解密失败,python,encryption,aes,Python,Encryption,Aes,我在最近使用PyCrypto进行的一个项目中使用AES编写了自己的加密方法。我使用哈希生成一个32字节的密码,并使用CBC将其提供给AES-256bit加密。文件输入使用PKCS#7填充以符合可被16整除的要求 我可以对文件进行加密和解密,而不会发生意外,并且最初与输出文件一起加密的输入文件具有相同的SHA-256哈希 我发现的唯一问题是,如果我提供了错误的密码,解密仍然会发生。这是我正在做的一个问题,因为如果密码短语错误,我需要解密快速失败 我怎样才能做到这一点?我听说过AES加密的其他方法,

我在最近使用PyCrypto进行的一个项目中使用AES编写了自己的加密方法。我使用哈希生成一个32字节的密码,并使用CBC将其提供给AES-256bit加密。文件输入使用PKCS#7填充以符合可被16整除的要求

我可以对文件进行加密和解密,而不会发生意外,并且最初与输出文件一起加密的输入文件具有相同的SHA-256哈希

我发现的唯一问题是,如果我提供了错误的密码,解密仍然会发生。这是我正在做的一个问题,因为如果密码短语错误,我需要解密快速失败


我怎样才能做到这一点?我听说过AES加密的其他方法,但PyCrypto似乎只支持ECB、CBC、CFB、OFB、CTR和OpenPGP。我如何实现加密性强的AES,如果没有正确的密码短语,它将无法解密?

AES(或任何其他加密算法)不能让您知道您是否拥有正确的密钥。也就是说,当你真的想在数学领域之外使用密码学时,这是一个非常有用的特性

您需要做的是在消息的开头添加一个具有已知值的块,这样在解密第一个块后,您可以将其与已知值进行比较,并知道您是否有错误的密钥。如果要加密的数据具有已知的标头,则可以使用此标头


或者,您可以将密钥的加密哈希(例如SHA-256)与消息一起发送,攻击者只有在能够破坏哈希的情况下才能恢复密钥。

确保密文在更改时不会解密的最佳方法是添加身份验证标记。身份验证标签用于提供密文的身份验证和完整性

该标签可以由密文上的MAC(例如AES-CMAC或使用SHA-256的HMAC)组成。但是,这需要第二个密钥来确保安全

另一种方法是使用经过身份验证的加密,如GCM。GCM使用单个密钥并生成一个身份验证标签(可以配置大小)

确保使用正确生成的IV。IV可以作为密文的前缀,并且在计算身份验证标记时应包括在内),并且不要忘记,纯文本的大小可能不会被隐藏

您应该在解密密文之前验证标记的正确性


请注意,一般情况下,不应加密密码,除非以后需要访问精确的密码。要验证密码,请改用PBKDF2。

要提供所需的fail fast属性,您需要在加密的数据前添加一个标头。我建议使用一个随机的“混杂因子”(类似于密码)与一个已知的常量“”连接;混杂因素的存在,就像一种盐一样,提供了一种针对基于预计算表的攻击的防御措施


有了这样一个报头,您只需要破译报头并验证幻数字段;如果它与已知常数不匹配,则键不好。如果匹配,则丢弃标题并处理输入的其余部分。

我已经编写了自己的加密方法
——这是您的问题。我没有编写自己的加密方法。我写了一个程序,使用AES作为加密方法。我并不是说daft.AES只是一个原语(分组密码)。我知道我的“加密方法”是指将这个原语(和其他原语)用于更高级别的目的(对任意数量的数据进行基于密码的加密)。这就是我的意思:这仍然是你自己不应该做的事情。你能推荐一种安全的加密方法吗?它提供256位加密,使用强而慢的散列方法作为其密钥,并且可以在不知道文件全长的情况下进行加密?如果有一个能满足我所有要求的解决方案,那将是非常棒的。我很确定有现有的解决方案,但我不是专家。至少对于散列部分,有PBKDF2。对任意长度的明文应用流密码也是由专家编写和审查的软件定期完成的(另一方面,加密人员每隔一个月就会提出更复杂的攻击)。至于将两者结合起来,我感到很困惑,但我假设存在现有的标准,尽管可能没有开源实现。我不是密码专家,但如果明文的第一块是已知值,攻击者就不能通过查看密文的第一块轻易获得密钥吗(和IV,如果适用,但包含在纯文本中)?我希望不是,那将是一个问题。如果你非常偏执,你可以让第一个块成为密钥,或者对密钥进行不可逆的散列。@JeffreyHantin如果密钥有足够的熵,例如,如果它是随机生成的,这不是问题。请注意,这是关于加密密码,而不是用密码加密某些内容。警告:接受ed answer使用非标准加密实践。通过密文的MAC或经过身份验证的加密是接受或拒绝密文的方式。@JeffreyHantin这或多或少是交叉发布到的,没有太多提示,讨论仍在继续。我现在正在使用密码的哈希方法bcrypt,尽管我可能使用PBKDF2。对不起当然,Python中几乎不支持经过身份验证的AES模式。我对MACing ciphertext几乎一无所知,对从哪里开始有什么想法吗?我想使用一些适合我的东西,这样我就不太可能把它弄糟并危及安全性。似乎做了很多正确的事情。HMAC带有SHA256,两个键,HMAC中的IV.不能完全保证,但看起来确实不错。。。