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;
即可解决您的问题。
我尝试将二进制输入到具有自己模式的 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;
即可解决您的问题。