AES算法中有一个函数,在Galois域中将一个字节乘以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然后再转换为字节会产生影响吗?
答案 0 :(得分:2)
我认为在这种情况下,对int
的施法无效,导致施放<=>在左移后。让我们举个例子:
byte b = 0x1000;
//temp1 == 0x00000000;
int temp1 = (int)(b << 1);
//temp2 == 0x00010000;
int temp2 = ((int)b) << 1);
因为您可以看到括号对结果有很大影响,但如果从网站上获取公式,您的代码应该表现相同。
答案 1 :(得分:1)
我认为这是正确的,但是:
确保最好的方法是简单地测试它;只有256个案例,编写测试用例不需要花费很多时间。