我有两个代码片段,应该在满足恒定时间要求时进行研究。如果不满足,则应修改代码。
第一:
unit8_t a[128]
unit8_t data[128]
if(k) //k is a secret variable
memcpy(data,a,128);
此代码段不满足恒定时间要求,因为如果k为false,将不执行复制指令,并且执行时间将比执行memcpy快得多。但是我真的不知道如何更改才能满足要求。
第二:
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, k ? a : b, 128);
我猜它也不能满足恒定时间要求,因为产生分支的三元运算符。但是在这里我不确定,我也不知道如何重写代码。
答案 0 :(得分:1)
第一个示例:
unit8_t a[128]
unit8_t data[128]
if(k) //k is a secret variable
memcpy(data,a,128);
让它分支:
k的分支A == true:
unit8_t a[128];
unit8_t data[128];
memcpy(data,a,128);
B的k == false:
unit8_t a[128];
unit8_t data[128];
//no memcpy
第二个示例:
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, k ? a : b, 128);
k的分支A == true:
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, a, 128); //from a to data
B的k == false:
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, b, 128); //from b to data
两个示例显然执行不同的任务,但是第二个示例可能对两个分支以相同的步骤执行。但是其中存在一个很大的“ but”,因为编译器可能会将其优化为两个分支都不相同的代码,并且不会为该任务提供恒定的时间执行。
答案 1 :(得分:0)
由于没有其他细节,我们不能在这里假设优化器是“智能”的。 在第一种情况下,您可以添加
else
memcpy(a, data, 128);
在第二种情况下,没有要添加的内容。
让我添加一些可能会影响时间的注意事项
但是,由于示例的简单性,它看起来像是定时攻击中的第一个练习。我现在不用担心所有这些事情。