是否可以使用 SHA-256 使用 PBKDF2 派生 128 位 AES 密钥

Is Deriving a 128 bits AES Key with PBKDF2 using SHA-256 possible

我正在开发一个加密协议,我必须在 CTR 模式下创建一个 AES 密钥。我决定将密钥长度保持为 128 位,因为较短的密钥长度意味着移动设备的计算能力较低。

现在,为了创建这个密钥,我使用 PBKDF2,它允许我设置它的某些参数,比如哈希函数和迭代次数,因为它使用初始信息(比如密码)派生出一个密钥,这就是我有。由于 SHA-1 损坏,我想将 SHA-256 用于密钥派生函数的密钥散列,但我不明白这是否可行。由于我希望密钥为 128 位,而 SHA-256 生成 256 位,PBKDF2 是否能够做到这一点?

首先,与 AES-128 相比,AES-256 并没有那么慢。见自Cryptography

CPU overhead (+20% for a 192-bit key, +40% for a 256-bit key:

PBKDF2 的输出大小等于使用的 PRF 函数,在您的情况下它是一个哈希函数,如 SHA-256。因此输出将是 256 位大小。

PBKDF2 的功能需要一个 dkLen 参数 - 所需的密钥长度。

PBKDF2(PRF, Password, Salt, c, dkLen)

当您将 128 放入此参数中时,您将获得 128 位。输出是完整 256 位输出的子串。您将获得第一个 128 位。

你可以从实现中看到它 here

AES-256 并不比 AES-128 慢多少,密钥设置稍慢,每个块只需要多 4 轮(11 到 15)。所以它最多慢 40%,而现代手机有专用的 AES-instruction 集可能甚至更少。

PBKDF2 几乎可以输出任何大小的密钥,主要是 HMAC-SHA1 或 HMAC-SHA256(不是直接的 SHA1 或 SHA256,但大多数 API 只接受哈希函数作为参数并隐式执行 HMAC ) 用作积木 "random function"。但是其中任何一个都可以生成 256、128 或 10000 字节的密钥(并不是说您无论如何都需要那么大的密钥)。使用 HMAC-SHA256,派生 256 位或 128 位密钥同样便宜或昂贵(后者是前者的截断版本,但这不是问题);这是同样的工作。使用 HMAC-SHA1(与 PBKDF2 的 HMAC-SHA256 一样安全),获得 256 位密钥的工作量要多一些,因为 256 位大于摘要大小。

所以使用AES-256和PBKDF2-(HMAC)-SHA256,应该没有性能问题。