免责声明:我很清楚实现自己的加密货币是一个非常糟糕的主意。这是硕士论文的一部分,该代码将不会在实践中使用。

作为较大的加密算法的一部分,我需要对一个恒定长度的数组(较小的,精确到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/

    10-17 01:36