在PBKDF2中是INT(i)签名?

时间:2017-07-12 05:09:41

标签: security sha hmac integer-overflow pbkdf2

RFC 2898的第11页规定,对于U_1 = PRF(P,S || INT(i)),INT(i)是整数i的四个八位字节编码,最重要的是八位字节。

这是否意味着我是一个有符号的值,如果是这样,溢出会发生什么?

2 个答案:

答案 0 :(得分:1)

没有人说会签名。 dkLen上限为(2^32 - 1) * hLen的事实表明它是无符号整数,并且无法从0xFFFFFFFF(2 ^ 32 - 1)翻转到0x00000000。< / p>

当然,在您要求34,359,738,368字节之前,PBKDF2(MD5)不会达到2 ^ 31。这是一个非常多的字节。

  • SHA-1:42,949,672,960
  • SHA-2-256 / SHA-3-256:68,719,476,736
  • SHA-2-384 / SHA-3-384:103,079,215,104
  • SHA-2-512 / SHA-3-512:137,438,953,472

由于.NET实现(在Rfc2898DeriveBytes中)是一个迭代流,因此可以通过(长)系列调用轮询32GB。大多数平台都将PBKDF2暴露为一次性,因此您需要为它们提供32GB(或更多)的内存范围,以确定它们是否存在远远超出的错误。因此,即使大多数平台的标志都有误......但这并不重要。

PBKDF2是KDF(密钥派生函数),因此用于导出密钥。 AES-256是32字节,如果使用相同的PBKDF2生成IV(你真的不应该),则为48字节。使用34,093 digit prime为ECC曲线生成私钥是(如果我的数学运算正确)14,157字节。远低于32GB标记。

答案 1 :(得分:0)

i的范围是1到l = CEIL (dkLen / hLen)dkLenhLen是正整数。因此,i严格为正。

但是,您可以将i存储在带符号的32位整数类型中,而无需任何特殊处理。如果i翻转(从0x7FFFFFFF增加到0xF0000000),它将继续正确编码,并继续正确递增。使用二进制补码编码时,只要所有值都被视为有符号或无符号,加法,减法和乘法的按位结果都是相同的。