查看 Go 标准库,有一个ConstantTimeByteEq函数,如下所示:func ConstantTimeByteEq(x, y uint8) int { z := ^(x ^ y) z &= z >> 4 z &= z >> 2 z &= z >> 1 return int(z)}现在,我理解需要进行恒定时间字符串(数组等)比较,因为常规算法可能会在第一个不相等元素之后短路。但是在这种情况下,两个固定大小整数的常规比较不是已经在 CPU 级别进行了恒定时间操作吗?
3 回答
元芳怎么了
TA贡献1798条经验 获得超7个赞
不必要。并且很难说编译器在进行优化后会发出什么。对于高级别的“比较一个字节”,您最终可能会得到不同的机器代码。在侧信道中泄漏一点点可能会将您的加密从“基本上无法破解”更改为“希望不值得破解所需的钱”。
四季花海
TA贡献1811条经验 获得超5个赞
如果调用该函数的代码根据结果立即分支,则使用常量时间方法不会提供太多额外的安全性。另一方面,如果要在一堆不同的字节对上调用该函数,保持结果的运行总数,并且仅根据最终结果进行分支,那么外部窥探者可能能够确定最后分支被采用,但不知道是哪个先前的字节比较负责它。
话虽如此,我不确定在大多数用例中我是否看到了将方法的输出提炼为 0 或 1 的麻烦的很多优点;简单地保持运行记录notEqual = (A0 ^ B0); notEqual |= (A1 ^ B1); notEqual |= (A2 ^ B2); ...
将达到相同的效果并且速度更快。
- 3 回答
- 0 关注
- 165 浏览
添加回答
举报
0/150
提交
取消