【发布时间】:2020-08-25 20:55:44
【问题描述】:
我正在撰写关于为后量子安全签名编写的代码的硕士论文(计算机科学)。整个事情可以在here 找到,但在这里并不重要。在我的论文中,我试图解释一个“简单”的函数,这根本不是那么简单。
函数测试galois-fieldGF(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 在 cmets 中建议了第二个代码 sn-p 的更简单方法。
【问题讨论】:
-
很好奇。为什么不同:
& 0xf和后来使用& 15? -
是一样的。十六进制的 F 是十进制的 15。后来我只用了15,因为它更明显。
-
最明显的是
0b1111;然后0xF。15是最不明显的位掩码。 -
我认为这取决于,当您使用 GF16 时,它可能非常明显。但整件事不是重点。
标签: galois-field c performance bit-manipulation galois-field post-quantum-cryptography