将单维数组转换为C#中的2D数组,用于AES数据矩阵

时间:2015-04-13 14:37:22

标签: c# arrays multidimensional-array

我正在尝试从单维数组生成2D数组,以在Rijndael或AES加密过程中生成数据状态。我一直在尝试使用此代码;

public byte[,] MakeAState(byte[] block){
byte[,] State;

foreach (byte i in block)
    for (int row = 0; row < 4; row++)
        for (int column = 0; column < 4; column++)
            State[column, row] = i;

return State;
}

我打算让结果像这样

//Original Sequence
[99 111 98 97 112 97 115 115 99 111 98 97 112 97 115 115]

//Desired Sequence
[99 112 99 112]
[111 97 111 97]
[98 115 98 115]
[97 115 97 115]

结果总是出现,好像Block的元素一样使用了State数组的索引,导致出现'out-of boundary'错误消息。关于如何管理这个的任何想法?

2 个答案:

答案 0 :(得分:3)

您可能会在row上翻转columnState[column, row] = i;,这可能导致您的越界异常。但是,如果没有关于变量的更多信息,就无法分辨。

但这不是唯一的问题。假设您只想将数组拆分为四个一组。如果您翻转row / column并超越您的例外,这就是您目前的情况。

//Original sequence: 
[0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15]

//Desired sequence:
[0  4  8  12]
[1  5  9  13]
[3  6  10 14]
[4  7  11 15]

//What you are currently getting:
[15 15 15 15]
[15 15 15 15]
[15 15 15 15] //<-- Last value of original sequence, everywhere.

您的代码中发生的事情是Block中的每个位置都放置在新数组中的每个位置,这意味着您最终会得到一个填充了Block的最后一个值的数组算法完成了。

将其更改为此类会返回您想要的结果。

public static byte[,] State(byte[] Block)
{
    if (Block.Length % 16 != 0)
        throw new Exception("Byte array length must be divisible by 16.");

    var rowCount = Block.Length / 4;
    var State = new byte[rowCount, 4];

    for (int column = 0, block = 0; column < 4; column++)
        for (int row = 0; row < rowCount; row++, block++)
            State[row, column] = Block[block];

    return State;
}

答案 1 :(得分:3)

这应该是你想要的,并且它使用除法和模来确定列和行(只需切换&#34; i%4&#34;用&#34; i / 4&#34;如果你想转动矩阵):

class Program
{
    static void Main(string[] args)
    {
        byte[] original = new byte[] { 99, 111, 98, 97, 112, 97, 115, 115, 99, 111, 98, 97, 112, 97, 115, 115 };
        byte[,] result = MakeAState(original);

        for (int row = 0; row < 4; row++)
        {
            for (int column = 0; column < 4; column++)
            {
                Console.Write(result[row,column] + "   ");
            }
            Console.WriteLine();
        }


    }

    public static byte[,] MakeAState(byte[] block)
    {
        if (block.Length < 16)
        {
            return null;
        }

        byte[,] state = new byte[4,4];

        for (int i = 0; i < 16; i++)
        {
            state[i % 4, i / 4] = block[i];
        }

        return state;
    }
}

}

输出:

99 112 99 112

111 97 111 97

98 115 98 115

97 115 97 115