固定时间代码

时间:2018-10-14 09:17:47

标签: c++

我有两个代码片段,应该在满足恒定时间要求时进行研究。如果不满足,则应修改代码。

第一:

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);

我猜它也不能满足恒定时间要求,因为产生分支的三元运算符。但是在这里我不确定,我也不知道如何重写代码。

2 个答案:

答案 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);

在第二种情况下,没有要添加的内容。

让我添加一些可能会影响时间的注意事项

  1. 一个好的优化程序将检测a,b或数据的使用方式。因此,它可以确定对memcpy的某些调用是多余的,并且将跳过这些调用。 (或在函数返回之前分支)。
  2. 缓存-如果已经缓存了a,b或数据,则访问速度可能更快。这种将a复制到数据或将数据复制到a的方法可以在不同的时间执行
  3. 分支预测-即使使用'even'if / else语句,编译器也可以由于预测而生成不对称代码。多次重新运行可以检测到异常。

但是,由于示例的简单性,它看起来像是定时攻击中的第一个练习。我现在不用担心所有这些事情。