免责声明:我很清楚实现自己的加密货币是一个非常糟糕的主意。这是硕士论文的一部分,该代码将不会在实践中使用。
作为较大的加密算法的一部分,我需要对一个恒定长度的数组(较小的,精确到24个)进行排序,而不会泄漏有关此数组内容的任何信息。据我所知(如果这些不足以防止计时和缓存攻击,请更正我),这意味着:
是否存在这样的实现?如果没有,在这种类型的编程上是否有任何好的资源?
老实说,我什至都在为更简单的子问题而苦恼,即找到数组的最小值。
double arr[24]; // some input
double min = DBL_MAX;
int i;
for (i = 0; i < 24; ++i) {
if (arr[i] < min) {
min = arr[i];
}
}
添加带有虚拟分配的
else
足以使其定时安全吗?如果是这样,如何确保编译器(在我的情况下为GCC)不会撤消我的辛苦工作?这容易受到缓存攻击吗? 最佳答案
使用排序网络,一系列比较和交换。
交换调用一定不能依赖于比较。无论比较结果如何,都必须以执行相同数量指令的方式来实现。
像这样:
void swap( int* a , int* b , bool c )
{
const int min = c ? b : a;
const int max = c ? a : b;
*a = min;
*b = max;
}
swap( &array[0] , &array[1] , array[0] > array[1] );
然后找到排序网络并使用交换。这是为您执行此操作的生成器:http://pages.ripco.net/~jgamble/nw.html
对于4个元素的示例,数字是由上面的链接生成的数组索引:
SWAP(0, 1);
SWAP(2, 3);
SWAP(0, 2);
SWAP(1, 3);
SWAP(1, 2);
关于c - 在C中实现定时,抗高速缓存攻击的排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36767281/