首页
学习
活动
专区
圈层
工具
发布

定时码
EN

Stack Overflow用户
提问于 2018-10-14 17:17:47
回答 2查看 285关注 0票数 2

我有两段代码片段,应该研究一下它们是否满足常量时间需求。如果没有实现,则应修订规范。

首先:

代码语言:javascript
复制
unit8_t a[128]
unit8_t data[128]
if(k)  //k is a secret variable
  memcpy(data,a,128);

这段代码不满足常量时间要求,因为如果k为false,则不会执行任何复制指令,并且执行时间将比执行memcpy快得多。但我真的不知道,如何改变才能满足需求。

第二:

代码语言:javascript
复制
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, k ? a : b, 128);

我猜它也不满足常量时间的要求,因为三元运算符构成了一个分支。但在这里我不确定,我也不知道如何重写代码。

EN

回答 2

Stack Overflow用户

发布于 2018-10-15 03:42:07

第一个示例:

代码语言:javascript
复制
unit8_t a[128]
unit8_t data[128]
if(k)  //k is a secret variable
  memcpy(data,a,128);

让我们对其进行分支:

分支A对于k ==为真:

代码语言:javascript
复制
 unit8_t a[128];
 unit8_t data[128];
 memcpy(data,a,128);

分支B表示k ==为false:

代码语言:javascript
复制
 unit8_t a[128];
 unit8_t data[128];
 //no memcpy

第二个例子:

代码语言:javascript
复制
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, k ? a : b, 128);

分支A对于k ==为真:

代码语言:javascript
复制
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, a, 128); //from a to data

分支B表示k ==为false:

代码语言:javascript
复制
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, b, 128); //from b to data

显然,这两个示例执行不同的任务,但是第二个示例可以在两个分支的相同步骤中执行。但是在那里有一个很大的“但是”,因为编译器可能会将其优化为对两个分支都不相同的代码,并且不会为该任务提供恒定的执行时间。

票数 1
EN

Stack Overflow用户

发布于 2018-10-15 04:04:12

在没有其他细节的情况下,我们不能假设优化器在这里是“聪明的”。在第一种情况下,您可以添加

代码语言:javascript
复制
else
memcpy(a, data, 128);

在第二种情况下,没有什么可添加的。

让我添加一些可能会影响计时的考虑因素

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52806327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档