System.IndexOutOfRangeException 使用 c# 输入分组密码

System.IndexOutOfRangeException on input block cipher using c#

我尝试将二进制输入到具有自己模式的 256 位长的块密码中。

使用输入 class

private string inputBinary(string binary_, string rule)
{
    var positionArray = rule.Split("\t\r\n, ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    char[]  result_ = new char[256];

    for (int i = 0; i < binary_.Length; i++)
    {
        int position = int.Parse(positionArray[i]);
        result_[position] = binary_[i];
    }
    return new string(result_);
}

有规则

input_plain[0] = "60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 16, 59, 75, 77, 80, 84, 89, 95, 102, 110, 119, 129, 140, 152, 165, 15, 45, 58, 76, 79, 83, 88, 94, 101, 109, 118, 128, 139, 151, 164, 14, 178, 44, 57, 78, 82, 87, 93, 100, 108, 117, 127, 138, 150, 163, 13, 177, 190, 43, 56, 81, 86, 92, 99, 107, 116, 126, 137, 149, 162, 12, 176, 189, 201, 42, 55, 85, 91, 98, 106, 115, 125, 136, 148, 161, 11, 175, 188, 200, 211, 41, 54, 90, 97, 105, 114, 124, 135, 147, 160, 10, 174, 187, 199, 210, 220, 40, 53, 96, 104, 113, 123, 134, 146, 159, 9, 173, 186, 198, 209, 219, 228, 39, 52, 103, 112, 122, 133, 145, 158, 8, 172, 185, 197, 208, 218, 227, 235, 38, 51, 111, 121, 132, 144, 157, 7, 171, 184, 196, 207, 217, 226, 234, 241, 37, 50, 120, 131, 143, 156, 6, 170, 183, 195, 206, 216, 225, 233, 240, 246, 36, 49, 130, 142, 155, 5, 169, 182, 194, 205, 215, 224, 232, 239, 245, 250, 35, 48, 141, 154, 4, 168, 181, 193, 204, 214, 223, 231, 238, 244, 249, 253, 34, 47, 153, 3, 167, 180, 192, 203, 213, 222, 230, 237, 243, 248, 252, 255, 33, 46, 2, 166, 179, 191, 202, 212, 221, 229, 236, 242, 247, 251, 254, 256, 32, 1, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31";

结果是 binary_[i] 与指定的数组不匹配,描述为 IndexOutOfRangeException was unhandled

如果您将 input_plain[0] 作为规则传递给您的函数,那么 input_plain[0] 中的条目 256 将导致越界异常。

正如您从代码中看到的那样,该规则被拆分为一个新的 positionArray 对象,其条目随后被解析为整数并保存到循环的 position 变量中。位置变量然后用于索引 result_。由于未修改位置变量,因此它直接使用规则字符串中的 256。由于 result_ 字符数组只有 256 个条目,因此它的最后一个索引条目将是 255。因此索引 256 会导致您看到的异常。

如果我不得不冒险猜测,我会说这段代码源自一种语言,该语言使用基于 1 的索引作为其数组。这似乎很有可能,因为我在 input_plain[0] 中没有看到数字 0。也许只需将 int position = int.Parse(positionArray[i]); 更改为 int position = int.Parse(positionArray[i]) - 1; 即可解决您的问题。