我正在开发一种加密协议,必须在CTR模式下创建一个AES密钥。我决定将密钥长度保持为128位,因为密钥长度越短,移动设备的计算能力就越低。
现在,要创建此密钥,我使用PBKDF2,它允许我设置其某些参数(例如哈希函数和迭代数),因为它使用诸如密码之类的初始信息派生了密钥。由于SHA-1损坏,我想将SHA-256用于密钥派生函数的密钥散列,但我不知道是否可能。因为我希望密钥为128位,而SHA-256正在产生256位,PBKDF2能够做到这一点吗?
答案 0 :(得分:1)
首先,与AES-128相比,AES-256并没有那么慢。从Cryptography
查看CPU开销(对于192位密钥,增加20%,对于256位密钥,增加40%:
PBKDF2的输出大小等于使用的PRF函数,在您的情况下,它是一个哈希函数,如SHA-256。因此,输出将为256位大小。
PBKDF2的功能需要一个setState
参数-所需的按键长度。
PBKDF2(PRF,密码,Salt,c,dkLen)
当您在此参数中输入128时,将得到一个128位。输出是完整的256位输出的子字符串。您将获得第一个128位。
您可以从实现中看到它为here
答案 1 :(得分:1)
AES-256不会比AES-128慢很多,密钥设置也稍慢一些,每个块只需要再进行4轮(11到15)。因此,它最多最多慢40%,而对于具有专用AES指令集的现代手机,它甚至可能更少。
PBKDF2几乎可以输出任何大小的密钥,并且大多数都使用HMAC-SHA1或HMAC-SHA256(不直接使用SHA1或SHA256,但是大多数API仅接受哈希函数作为参数并隐式地执行HMAC)用作构建模块“随机函数”。但是任何一个都可以产生256、128或10000个字节的密钥(无论如何您都不需要那么大的密钥)。使用HMAC-SHA256,获得256位或128位密钥既便宜又昂贵(后者是前者的截短版本,但这没什么问题)。这是相同的工作。使用HMAC-SHA1(与PBKDF2的HMAC-SHA256一样安全),获得256位密钥的工作量要大得多,因为256大于摘要大小。
因此,使用AES-256和PBKDF2-(HMAC)-SHA256,应该没有性能问题。