RFC2898的第11页指出,对于U_1 = PRF (P,S || INT ( i )),INT (i)是整数i的四个八位字节编码,最高有效八位字节在前。
这是否意味着我是一个带符号的值,如果是这样,溢出时会发生什么?
发布于 2017-07-12 23:10:06
没有人说它会被签署。dkLen的上限是(2^32 - 1) * hLen,这表明它是一个无符号整数,不能从0xFFFFFFFF (2^32 - 1)转到0x00000000。
当然,在您请求34,359,738,368字节之前,PBKDF2(MD5)不会达到2^31。这是一个可怕的字节数。
SHA-1: 42,949,672,960
/
/SHA-3-256:68,719,476,736
由于.NET实现(在Rfc2898DeriveBytes中)是一个迭代流,因此可以通过一系列(长)调用轮询32 be。大多数平台将PBKDF2暴露为一次性操作,因此您需要为它们提供32 an (或更大)的内存范围,以确定它们是否有那么大的错误。因此,即使大多数平台的符号有误...这真的不重要。
PBKDF2是一个密钥派生函数,所以用来派生密钥。AES-256是32字节,或者48字节,如果您使用相同的PBKDF2来生成IV (实际上您不应该这样做)。使用34,093 digit prime为ECC曲线生成私钥是14,157字节(如果我没算错的话)。远远低于32 the大关。
发布于 2017-07-12 23:36:16
i的范围从1到l = CEIL (dkLen / hLen),dkLen和hLen是正整数。因此,i是严格正的。
但是,您可以将i存储在有符号的32位整数类型中,而无需任何特殊处理。如果i翻转(从0x7FFFFFFF到0xF0000000递增),它将继续正确编码,并继续正确递增。使用二的补码编码,加法、减法和乘法的逐位结果是相同的,只要所有的值都被视为有符号或无符号的。
https://stackoverflow.com/questions/45048872
复制相似问题