我正在撰写计算机科学硕士论文,研究的是针对后量子安全签名编写的代码。整个内容可以在这里找到,但这不是重点。为了论文,我尝试解释一个“简单”的函数,但实际上并不简单。
该函数测试变量在伽罗华域GF(16)中是否为非零值。(这里的GF(16)可以理解为4位无符号整数)。该函数如下:
我理解它的工作原理,但我不明白为什么这个函数需要如此复杂。可能有很好的理由,比如性能或安全方面的好处(例如防止时间攻击)。因为如果没有这些好处,把函数写成简单易懂的方式岂不更聪明:
该函数测试变量在伽罗华域GF(16)中是否为非零值。(这里的GF(16)可以理解为4位无符号整数)。该函数如下:
static inline uint8_t gf16_is_nonzero(uint8_t a) {
unsigned a4 = a & 0xf; // mask lowest 4 bits of a
unsigned r = 0u - a4; // set 4 high bits if a is nonzero
r >>= 4; // right-shift high bits into low bits
return r & 1; // return lowest bit
}
我理解它的工作原理,但我不明白为什么这个函数需要如此复杂。可能有很好的理由,比如性能或安全方面的好处(例如防止时间攻击)。因为如果没有这些好处,把函数写成简单易懂的方式岂不更聪明:
static inline uint8_t gf16_is_nonzero(uint8_t a) {
return (a & 15) != 0;
}
修改
这段代码不是我写的,而是由加密研究人员编写的,他们正在尝试让他们的PQ算法被NIST标准化。
TonyDelroy在评论中提出了第二个代码片段的更简单的方法。
& 0xf
和后面使用& 15
的区别? - chux - Reinstate Monica0b1111
;然后是0xF
。对于位掩码,15
是最不明显的。 - Vlad Feinstein