我正在使用一些 bigint 公钥加密代码。使用按位掩码来确保计算时序和访问的内存地址独立于数据值是否安全?
这种技术是否容易受到基于指令时序、功率、射频发射或其他我不知道的事情的侧信道攻击?(作为参考,我知道 RSA 致盲、EC 蒙哥马利阶梯、缓存刷新等技术。)
简单代码示例 (C/C++):
uint a = (...), b = (...);
if (a < b)
a += b;
现在翻译为使用恒定时间掩码:
uint a = (...), b = (...);
uint mask = -(uint)(a < b);
a = ((a + b) & mask) | (a & ~mask);
注意a < b
是 0 或 1,掩码为 0x00000000 或 0xFFFFFFFF。
同样,对于高级操作 (C++):
Integer x = (...);
if (x.isFoo())
x.doBar();
以下是可接受的安全翻译吗?
Integer x = (...);
uint mask = -(uint)x.isFoo(); // Assume this is constant-time
Integer y(x); // Copy constructor
y.doBar(); // Assume this is constant-time
x.replace(y, mask); // Assume this uses masking