分组密码SAFER+的C#实现
2009-02-27 08:18:34 来源:WEB开发网接着进行线性层运算,即将input数组右乘矩阵m_LinearTransMatrixBox(该矩阵的说明详见参考文献[1]),代码如下:
input[2] = (byte)((input[2] + input[0]) & 0xFF);
input[0] = (byte)((input[0] + input[2]) & 0xFF);
......
temp = input[30];
input[30] = input[6];
input[6] = temp;
其实这段繁杂的代码就是一维数组input[]与一个二维数组m_LinearTransMatrixBox[][]的乘积,那么为什么不用以下更精炼的代码呢?
Byte[] temp = new byte[input.length];
For (j=0;j<16;j++)
For (k=0;k<16;k++)
{
Temp[2*j] +=(byte)(input[2*k] * m_nLinearTransMatrixBox[k,j]);
}
For (j=0;j<16;j++)
{
Input[2*j] = (byte)temp[2*j];
}
其中:
Static public byte[,] m_nLinearTransMatrixBox = newbyte[16,16]
{
{2,2,1,1,16,8,2,1,4,2,4,2,1,1,4,4},
{1,1,1,1,8,4,2,1,2,1,4,2,1,1,2,2},
{1,1,4,4,2,1,4,2,4,2,16,8,2,2,1,1},
{1,1,2,2,2,1,2,1,4,2,8,4,1,1,1,1},
{4,4,2,1,4,2,4,2,16,8,1,1,1,1,2,2},
{2,2,2,1,2,1,4,2,8,4,1,1,1,1,1,1},
{1,1,4,2,4,2,16,8,2,1,2,2,4,4,1,1},
{1,1,2,1,4,2,8,4,2,1,1,1,2,2,1,1},
{2,1,16,8,1,1,2,2,1,1,4,4,4,2,4,2},
{2,1,8,4,1,1,1,1,1,1,2,2,4,2,2,1},
{4,2,4,2,4,4,1,1,2,2,1,1,16,8,2,1},
{2,1,4,2,2,2,1,1,1,1,1,1,8,4,2,1},
{4,2,2,2,1,1,4,4,1,1,4,2,2,1,16,8},
{4,2,1,1,1,1,2,2,1,1,2,1,2,1,8,4},
{16,8,1,1,2,2,1,1,4,4,2,1,4,2,4,2},
{8,4,1,1,1,1,1,1,2,2,2,1,2,1,4,2}
}
更多精彩
赞助商链接