关键盐和初始值AES

use*_*069 4 encryption cryptography

我正在使用带有256位密钥的cbc模式的AES创建加密方案.在我了解CBC模式和初始值之前,我计划为每个加密行为和存储盐创建一个32位盐.密码/输入的密钥将用这个盐填充,最多32位.

即.如果输入的密码/密钥是"树",而不是用28 0填充它,它将用这个盐的前28个字符填充.

然而,这是在我了解iv之前,在某些地方也被称为盐.现在出现的问题是,这种早期的腌制方法原则上是否与IV有关.这将假设盐和iv将与密文一起存储,因此理论上的暴力攻击不会被阻止.

存储此密钥并使用它而非使用它是一个需要付出一些努力的步骤,所以值得一提的是,我认为它是否是一个实际上无用的措施.根据当前的知识,并不是可以使用任何用于AES的强力解密表,甚至16位盐也难以创建md5表.

谢谢,以利亚

Maa*_*wes 10

你知道CBC是好的,因为它肯定比使用ECB模式加密更好(尽管存在更好的模式,例如经过验证的模式GCM和EAX).

我想你应该知道几件事情,所以我会在这里解释一下.


密钥和密码不一样.通常,您使用密钥派生函数从密码中创建用于对称加密的密钥.这里讨论的最常见的是PBKDF2(基于密码的密钥导出函数#2),它用于PBE(基于密码的加密).这是由RSA实验室最新的开放式PKCS#5标准定义的.在输入密码之前,需要检查密码是否正确转换为字节(字符编码).

salt用作密钥派生函数的另一个输入.它用于防止使用"彩虹表"进行暴力攻击,其中密钥是针对特定密码预先计算的.由于盐,攻击者不能使用预先计算的值,因为他不能为每个盐生成一个.盐通常应为8字节(64位)或更长; 使用128位盐可以提供最佳的安全性.salt还确保相同的密码(不同用户)不会获得相同的密钥.

密钥派生函数的输出是dkLen字节的秘密,其中dkLen是要生成的密钥的长度(以字节为单位).由于AES密钥不包含除这些字节之外的任何内容,因此AES密钥将与生成的密钥相同.dkLenAES的密钥长度应为16,24或32字节:128,192或256位.


好的,现在你终于有了一个AES密钥可供使用.但是,如果只使用此键加密每个纯文本块,则如果纯文本块相同,则会得到相同的结果.CBC模式通过在进行加密之前使用最后一个加密块对下一个纯文本块进行异或来解决这个问题.最后一个加密块是"向量".这并不适用于第一个块的工作,因为那里没有最后加密块.这就是您需要指定第一个向量的原因:"初始化向量"或IV.

AES的块大小为16字节,与密钥大小无关.因此,包括初始化向量的向量也需要是16个字节.现在,如果您只使用密钥来加密例如单个文件,那么IV可以只包含16个字节,值为00h.

这不适用于多个文件,因为如果文件包含相同的文本,您将能够检测到加密文件的第一部分是相同的.这就是为什么您需要为使用密钥执行的每个加密指定不同的IV.它包含什么并不重要,只要它是唯一的,16字节并且对执行解密的应用程序是已知的.

[编辑6年后] 上述部分并不完全正确:对于CBC来说,IV需要对攻击者来说是不可预测的,它不仅需要是唯一的.因此,例如不能使用计数器.

现在有一个技巧可能允许你一直使用所有零的IV:对于使用AES-CBC加密的每个纯文本,你可以使用相同的密码但不同的盐来计算密钥.在这种情况下,您只能将结果密钥用于单条信息.如果您不能为实现基于密码的加密的库提供IV,这可能是个好主意.

[编辑]另一个常用的技巧是使用PBKDF2的额外输出来导出IV.这样就完成了官方建议,即对手不应该预测CBC的IV.但是,您应该确保要求比基础哈希函数提供的更多PBKDF2函数输出.PBKDF2具有弱点,可以使对手在这种情况下获得优势.因此,如果将SHA-256用作PBKDF2的散列函数,则不要求超过256位.请注意,SHA-1是PBKDF2的通用默认值,因此只允许使用单个128位AES密钥.


IV和盐是完全独立的术语,尽管经常混淆.在您的问题中,您还会将位和字节,密钥大小和块大小以及彩虹表与MD5表混淆(没有人说加密很容易).有一点是肯定的:在密码学中,尽可能安全是值得的; 冗余安全性通常不是问题,除非你真的(真的)无法承受额外的资源.


当您了解这一切是如何工作的时候,我会认真地找到一个执行PBE加密的库.您可能只需要输入密码,盐,普通数据以及 - 如果单独配置 - IV.

[编辑]你现在应该找一个使用Argon2的库.PBKDF2仍然被认为是安全的,但在某些情况下它确实给攻击者带来了不公平的优势,让攻击者执行的计算次数少于该函数的常规用户.对于PBKDF /密码哈希来说,这不是一个好的属性.

  • 它必须是冗长的,因为在你的问题中有几个问题要处理,我无法看到人们的思想.此外,它可以帮助其他有类似问题的人.我总是每分钟输入300个字符(好日子). (2认同)