我在用一些比金的公钥密码。使用按位掩蔽以确保所访问的计算、定时和内存地址与数据值无关是否安全?
这种技术是否容易受到基于指令定时、功率、射频发射或其他我不知道的东西的侧通道攻击?(作为参考,我知道RSA致盲、EC Montgomery梯子、缓存刷新等技术。)
简单代码示例(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或0xFFFFFFF。
同样,对于高级别操作(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发布于 2015-01-11 12:11:13
在代码中使用掩蔽或其他技术可能是粗略的,因为编译器进行了您通常不知道的各种优化。你在最初的文章中提到的一些方法要好得多。
作为一个普遍的经验法则,使用众所周知的密码库,因为他们应该加强对侧通道的攻击。如果不能做到这一点,您通常可以转换信息,对其进行处理,然后将结果转换回来。这在公钥密码学中尤其有效,因为它通常是同态的。
https://stackoverflow.com/questions/27865974
复制相似问题