【问题标题】:Are these two functions the same?这两个功能一样吗?
【发布时间】:2011-02-26 17:26:41
【问题描述】:

AES 算法中有一个函数,在伽罗瓦域中将一个字节乘以 2。

这是网站中给出的功能

private static byte gfmultby02(byte b)
    {
      if (b < 0x80)
        return (byte)(int)(b <<1);
      else
        return (byte)( (int)(b << 1) ^ (int)(0x1b) );
    }

这是我写的函数。

private static byte MulGF2(byte x)
            {
            if (x < 0x80)
                return (byte)(x << 1);
            else
            {
                return (byte)((x << 1) ^ 0x1b);

            }

}

我需要知道的是,给定任何字节,这是否会以相同的方式执行。实际上,我担心额外转换为 int,然后再转换为 byte。到目前为止,我已经测试过了,看起来还不错。在极少数情况下,额外转换为 int 然后转换为 byte 会有所不同吗?

【问题讨论】:

    标签: c# integer byte


    【解决方案1】:

    我认为在这种情况下,转换为int 什么都不做,因为转换是在左移之后完成的。让我们举个小例子:

    byte b = 0x1000;
    
    //temp1 == 0x00000000;
    int temp1 = (int)(b << 1);
    //temp2 == 0x00010000;
    int temp2 = ((int)b) << 1);
    

    所以你可以看到括号对结果有很大的影响,但如果从网站上正确获取公式,你的代码应该表现相同。

    【讨论】:

      【解决方案2】:

      我认为是正确的,但是:

      确定的最好方法是简单地测试它;只有 256 个用例,编写测试用例应该不会花很多时间。

      【讨论】:

      • 除非 big-endian/little-endian 有所作为?
      • @Dan McG:不,这都是直接计算,甚至是字节大小的数据。没有字节序问题会影响这里的结果。
      • 确实,我只是把它扔到一个 Solaris/Sparc 和一个带有 c++ 的 Linux/Intel 机器上,它们的行为完全一样。
      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 2019-10-24
      • 1970-01-01
      相关资源
      最近更新 更多