RFC 2898的第11页规定,对于U_1 = PRF(P,S || INT(i)),INT(i)是整数i的四个八位字节编码,最重要的是八位字节。
这是否意味着我是一个有符号的值,如果是这样,溢出会发生什么?
答案 0 :(得分:1)
没有人说会签名。 dkLen
上限为(2^32 - 1) * hLen
的事实表明它是无符号整数,并且无法从0xFFFFFFFF
(2 ^ 32 - 1)翻转到0x00000000
。< / p>
当然,在您要求34,359,738,368字节之前,PBKDF2(MD5)不会达到2 ^ 31。这是一个非常多的字节。
由于.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)
,dkLen
和hLen
是正整数。因此,i
严格为正。
但是,您可以将i
存储在带符号的32位整数类型中,而无需任何特殊处理。如果i
翻转(从0x7FFFFFFF
增加到0xF0000000
),它将继续正确编码,并继续正确递增。使用二进制补码编码时,只要所有值都被视为有符号或无符号,加法,减法和乘法的按位结果都是相同的。