-1

我正在测量不同 C 函数的循环计数,我尝试将其设为恒定时间以减轻侧信道攻击(加密)。

我正在使用一个微控制器(来自 infineon 的 aurix),它有一个板载周期计数器,每个时钟周期都会递增,我可以读出它。

考虑以下:

int result[32], cnt=0;
int secret[32];
/** some other code***/

reset_and_startCounter(); //resets cycles to 0 and starts the counter
int tmp = readCycles(); //read cycles before function call

function(secret) //I want to measure this function, should be constant time

result[cnt++] = readCycles() - tmp; //read out cycles and subtract to get correct result

当我测量如上所示的周期时,有时我会收到不同数量的周期,具体取决于给函数的输入。(〜1-10个周期差异,功能本身需要大约3000个周期)。

我现在想知道它是否还不是完全恒定的时间,并且计算取决于一些输入。我查看了该功能并执行了以下操作:

void function(int* input){
    reset_and_startCounter(); 
    int tmp = readCycles(); 
   /*********************************
    ******calculations on input******
    *********************************/
    result[cnt++] = readCycles() - tmp;
}

无论给出什么输入,我都会收到相同数量的周期。

然后我还测量了仅调用该函数以及从该函数返回所需的时间。无论输入什么,两个测量值都是相同的。

我一直在使用 gcc 编译器标志 -O3,-fomit-frame-pointer。-O3 因为运行时很关键,我需要它快速。同样重要的是,微控制器上没有运行其他代码(没有操作系统等)

有没有人对此有可能的解释。我想要安全,我的代码是恒定的时间,而这些周期是任意的......

很抱歉这里没有提供可运行的代码,但我相信没有多少人有 Aurix 躺在周围:O

谢谢

4

1 回答 1

1

您使用的英飞凌 Aurix 微控制器专为硬实时应用而设计。它被有意设计为提供一致的运行时性能——它缺少大多数可能导致更复杂的 CPU 性能不一致的功能,例如高速缓存或分支预测。

虽然显示您的代码在这部分具有恒定的运行时间是一个开始,但您的代码在其他 CPU 上运行时仍然可能具有可变的运行时间。包含此 CPU 的设备也有可能通过其他渠道泄漏信息,特别是通过功率分析。如果使您的应用程序能够抵抗侧信道分析至关重要,您可能需要考虑使用专为加密应用程序设计的部件。(Aurix 不是这样的部分。)

于 2018-11-25T00:21:11.877 回答