【发布时间】:2015-03-08 02:14:35
【问题描述】:
我正在使用一些 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
【问题讨论】:
-
乍一看还可以,你在
-o的高设置下测试过吗?注意 doBar 当然不应该有副作用,因为现在如果isFoo返回 true 或 false,它就会被调用。
标签: c++ c cryptography constant-time