猿问

为什么我们需要一个恒定时间*单字节*比较函数?

查看 Go 标准库,有一个ConstantTimeByteEq函数,如下所示:


func ConstantTimeByteEq(x, y uint8) int {

    z := ^(x ^ y)

    z &= z >> 4

    z &= z >> 2

    z &= z >> 1


    return int(z)

}

现在,我理解需要进行恒定时间字符串(数组等)比较,因为常规算法可能会在第一个不相等元素之后短路。但是在这种情况下,两个固定大小整数的常规比较不是已经在 CPU 级别进行了恒定时间操作吗?


明月笑刀无情
浏览 170回答 3
3回答

元芳怎么了

不必要。并且很难说编译器在进行优化后会发出什么。对于高级别的“比较一个字节”,您最终可能会得到不同的机器代码。在侧信道中泄漏一点点可能会将您的加密从“基本上无法破解”更改为“希望不值得破解所需的钱”。

四季花海

如果调用该函数的代码根据结果立即分支,则使用常量时间方法不会提供太多额外的安全性。另一方面,如果要在一堆不同的字节对上调用该函数,保持结果的运行总数,并且仅根据最终结果进行分支,那么外部窥探者可能能够确定最后分支被采用,但不知道是哪个先前的字节比较负责它。话虽如此,我不确定在大多数用例中我是否看到了将方法的输出提炼为 0 或 1 的麻烦的很多优点;简单地保持运行记录notEqual = (A0 ^ B0); notEqual |= (A1 ^ B1); notEqual |= (A2 ^ B2); ...将达到相同的效果并且速度更快。
随时随地看视频慕课网APP

相关分类

Go
我要回答