【问题标题】:Optimize y = x*x in Galois field arithmetic优化伽罗瓦域算术中的 y = x*x
【发布时间】:2008-09-22 20:21:03
【问题描述】:

我有这个 C 代码在 GF(8) 上做乘法:

int32_t GaloisMultiply (int32_t a, int32_t b) 
{
    int32_t i;
    int32_t mask = 0x100;
    int32_t y = 0;

    for(i=0;i<8;i++) 
    {
        if(b & mask) 
        {
            y ^= a;
        }
        mask >>= 1;
        y <<= 1;
    }

    if(b & 0x1) 
    {
        y ^= a;
    }

    return(y);
}

这或多或少是教科书式的实现。

我想知道如果我可以断言 a 总是 b,我是否对上述算法进行了巧妙的优化,例如我做平方而不是乘法。顺便说一句,我不是在加密使用之后。我只是想利用 GF(8) 中的 x*x 将 x 的位与零位一一交错的事实。

已经有相当聪明的方法来做位交织,但是因为我发现 GF(8) 中的 x*x 做了位交织的事情(偶然)我不能停止尝试使用它比特交错优化。

有什么想法吗?

【问题讨论】:

    标签: c cryptography bit-manipulation low-level


    【解决方案1】:

    基于表格? link

    当你被限制为 x*x 时,它是一个稀疏矩阵。

    这是另一个good paper (and a library)

    【讨论】:

    • 但是很抱歉,我认为他们没有使用您明确谈论的平方效应(位交错)(或者考虑到这一点是否真的可以提高性能)。
    • 无论您是否进行平方,基于表格的方法都应该更快
    • 我很困惑。在不知道足球场的伽罗瓦场的情况下,您不能使用基于表格的方法对 8 位数字进行比特交错吗?我错过了什么?
    【解决方案2】:
    int32_t GaloisMultiply( int32_t a ) 
    {
      int32_t y = 0;
      int32_t b = a & 0x01ff;
    
      while ( b ) 
      {
        if ( b & 1 ) 
          y ^= a;
    
        a <<= 1;
        b >>= 1;
      }
      return y;
    }
    

    或者如果你喜欢:

    int32_t GaloisMultiply( int32_t a ) 
    {
      int32_t y = 0;
      for ( int32_t b = a & 0x01ff; b; b >>= 1 )
      {
        if ( b & 1 ) 
          y ^= a;
    
        a <<= 1;
      }
      return y;
    }
    

    这种方法比上面的原始代码更有效的原因主要是因为循环仅在参数中的所有“有趣”位被消耗之前执行,而不是盲目地检查所有 (9) 位。

    不过,基于表格的方法会更快。

    【讨论】:

    • 您应该添加一些细节,说明为什么这样做会更快
    • 谢谢,在看了看起来很短之后。不过我会用桌子。它更快。
    【解决方案3】:

    查找表绝对是多项式基伽罗瓦平方最快的。使用 GF(8) 时,它也是最快的乘法运算,但对于 ECC 中使用的较大字段,表变得太大。对于较大字段中的乘法,最好的算法是“从左到右组合”方法...(参见http://www.amazon.com/Elliptic-Cryptography-Springer-Professional-Computing/dp/038795273X 算法 2.36,第 50 页)。

    【讨论】:

    • 如果您使用多项式算法进行密码学,使用查找表可能不是一个好主意。至少如果您在通用计算机上运行。您查找的内存地址将取决于您正在计算的值,因此涉及的缓存集。有很多很多论文,攻击者通过这些论文反复观察缓存未命中,从而设法破解加密货币。甚至在现实世界中也出现过一些以这种方式进行的突破。一般来说,除非您在嵌入式系统中,否则请避免使用查找表。
    【解决方案4】:

    您可能可以编写一些程序集来做得更好。但是,如果这是您的应用程序的瓶颈,我会感到非常惊讶。你做过分析吗?这个功能似乎不值得优化。

    【讨论】:

    • 确实是瓶颈。如果我在不同的架构上运行代码,在硬件中进行乘法运算,我将获得高达 30% 的加速。
    【解决方案5】:

    这可能不是您想要的,但这里有一个小的加速:

    如果保证相同,则只传递一个参数。

    【讨论】:

      【解决方案6】:

      将“a”和“b”标记为 const 可能对编译器有所帮助。或者手动展开循环。不过,如果有帮助,那就太可惜了……

      顺便说一句,这不是专利雷区吗?

      【讨论】:

        猜你喜欢
        • 2012-07-22
        • 1970-01-01
        • 2015-07-10
        • 2021-08-17
        • 1970-01-01
        • 2021-09-06
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多