为了账号安全,请及时绑定邮箱和手机立即绑定

ConstantTimeByteEq 如何工作?

ConstantTimeByteEq 如何工作?

Go
繁花如伊 2021-06-14 14:01:49
在 Go 的密码库中,我找到了这个函数ConstantTimeByteEq。它有什么作用,它是如何工作的?// 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)}
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

x ^ yis 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

所以当 时它真的返回 1 x == y,否则返回0。


通常,如果 x 和 y 都为零,则比较所需的时间比其他情况少。此函数试图使所有调用都花费相同的时间,而不管其输入的值如何。这样,攻击者就不能使用基于时间的攻击。


查看完整回答
反对 回复 2021-06-21
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

它完全按照文档说的做:它检查 x 和 y 是否相等。从功能的角度来看,它非常x == y简单。

这样做x == y在这个隐蔽位摆弄路防止定时侧攻击算法:一个x == y可被编译到代码执行得更快,如果x = y和较慢如果X = Y(或反过来)由于在CPU的分支预测!。攻击者可以使用它来了解有关加密例程处理的数据的一些信息,从而危及安全性。


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信