0

我完全不知道这里发生了什么。

我正在为教育目的创建一个加密算法。

这是我的代码的开头:

    public static byte[] encrypt(byte[] block, byte[] cipher_key)
    {
        List<byte[]> debug_states = new List<byte[]>();
        List<byte[,,]> debug_cubes = new List<byte[,,]>();
        List<byte[]> debug_keys = new List<byte[]>();

        byte[] extended_key = KeyScheduler.GetExtendedKey(cipher_key);
        byte[] state = new byte[512];
        byte[] key = new byte[512];
        byte[,,] state_cube = new byte[8, 8, 8];

        debug_states.Add(state);
        debug_cubes.Add(state_cube);
        debug_keys.Add(key);

        for (short a = 0; a < 512; a++)
        {
            state[a] = (byte)(block[a] ^ cipher_key[a]);
        }

        for (short r = 0; r < 32; r++)
        {
            short i = 0;

            debug_states.Add(state);
            debug_cubes.Add(state_cube);
            debug_keys.Add(key);

            for (i = 0; i < 512; i++) {

                key[i] = (byte)extended_key[(r * 512) + i];
            }

            if (r == 2) { throw new Exception(); }

此后不久,当我抛出异常以检查变量时,它们都没有任何意义。例如,从我第一次将状态添加到 debug_states 列表时,它应该全为零,但 Visual Studio 却说它是 180,155,126,217 ......状态多维数据集也会发生同样的事情。更奇怪的是,这些值不能是随机的,因为每次运行程序时它们都是相同的,但我完全不知道它们来自哪里。extended_key 确实获得了正确的值,但仍然无法正常工作,请参阅下一段。

此外,以后每次我尝试更改其中一个变量时,它们都不会改变!在我的代码中再往下,有一个 for 循环可以多次更改状态、状态多维数据集和键,并每次都记录它们,但在每个调试条目中它们总是相同的。

到底是怎么回事???

4

1 回答 1

2

数组是引用类型。当您添加state时,debug_states您正在添加参考。将变量本身视为指向内存块的指针。所有这一切意味着任何未来的修改state都将反映在任何地方,也就是说,你会看到它们debug_states[0],就像你所拥有的一样。

state( debug_states[0])在您第一次添加全是 0。后来,你这样做了:

// state (and, by extension, debug_states[0]) is all 0's
for (short a = 0; a < 512; a++)
{
    state[a] = (byte)(block[a] ^ cipher_key[a]);
}
// state (and, by extension, debug_states[0]) is filled with values

不再充满 0,并且该突变反映在对数组的每个引用中。state

于 2013-10-10T05:00:47.470 回答