java中boolean到int的高效常量时间转换
表达式的常数时间和功计算对于防止密码算法中的旁道攻击非常重要。但是,我不知道Java中是否存在false/true和0/1之间的任何常量时间转换 作为反例java中boolean到int的高效常量时间转换,java,cryptography,Java,Cryptography,表达式的常数时间和功计算对于防止密码算法中的旁道攻击非常重要。但是,我不知道Java中是否存在false/true和0/1之间的任何常量时间转换 作为反例 int x = p ? 1 : 0; 似乎不具有该属性,因为执行中的分支可能意味着表达式的计算存在可检测的差异。在C/C++中 int x = p; 这样就可以了,但是Java中不允许这种隐式转换。有没有一个可移植的解决方案?当然越快越好 注意,这与 因为这个问题不考虑固定时间。 好的,暂时不要投票支持这个答案,因为我没有时间去验证它,但
int x = p ? 1 : 0;
似乎不具有该属性,因为执行中的分支可能意味着表达式的计算存在可检测的差异。在C/C++中
int x = p;
这样就可以了,但是Java中不允许这种隐式转换。有没有一个可移植的解决方案?当然越快越好
注意,这与
因为这个问题不考虑固定时间。 好的,暂时不要投票支持这个答案,因为我没有时间去验证它,但我在想:
public static int toIntConstantTime(final boolean b) {
int x = 0;
x |= b ? 0b01 : 0b10;
x |= !b ? 0b10 : 0b01;
return (x & ~(x >> 1)) & 0b01;
}
这使得答案总是执行操作,以两种方式执行分支,并且依赖于两个位。(请随意重新打开/重新关闭),因为Java可以被解释,或者可以被编译成机器代码,使用JVM想要的任何算法,预测
p的准确性能?1:0不可能。JIT编译器可能会也可能不会真正消除分支,我的观点是完全正确的。重新打开并投票表决。Java和Crypto的黄金:)我明天会尝试验证(也许沃伦想在那之前试一试)…酷。由于存在不同的执行路径,因此计时可能仍然不同(代码缓存未命中等)。如果有一些答案没有不同的路径,那就太好了。我开始觉得这是不可能的。。。