在大神的密码库里,找到了这个函数ConstantTimeByteEq http://golang.org/src/pkg/crypto/subtle/constant_time.go?s=897:936#L17。它有什么作用,如何工作?
// ConstantTimeByteEq returns 1 if x == y and 0 otherwise.
func ConstantTimeByteEq(x, y uint8) int {
z := ^(x ^ y)
z &= z >> 4
z &= z >> 2
z &= z >> 1
return int(z)
}
x ^ y
is x XOR y
,其中当参数不同时结果为 1,当参数相同时结果为 0:
x = 01010011
y = 00010011
x ^ y = 01000000
^(x ^ y)
否定这一点,即当参数不同时得到 0,否则得到 1:
^(x ^ y) = 10111111 => z
然后我们开始转移z
向右,用于自行屏蔽其位。移位用零位填充数字的左侧:
z >> 4 = 00001011
目标是传播任何零z
对于结果,开始 AND 运算:
z = 10111111
z >> 4 = 00001011
z & (z >> 4) = 00001011
还折叠新值以将任何零向右移动:
z = 00001011
z >> 2 = 00000010
z & (z >> 2) = 00000010
进一步折叠到最后一位:
z = 00000010
z >> 1 = 00000001
z & (z >> 1) = 00000000
另一方面,如果你有x == y
最初,它是这样的:
z = 11111111
z (& z >> 4) = 00001111
z (& z >> 2) = 00000011
z (& z >> 1) = 00000001
所以当x == y
, 否则为 0。
一般来说,如果 x 和 y 都为零,则比较所需的时间比其他情况要少。该函数尝试使所有调用都花费相同的时间,而不管其输入的值如何。这样,攻击者就无法使用基于时间的攻击。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)