Перестановочный шифр, исправить код - C#
Формулировка задачи:
Задание : В перестановочных шифрах меняется порядок следования символов. В простом перестановочном шифре в качестве ключа выбирается перестановка чисел от 0 до n. Например, для n=7 можно использовать перестановку 3,2,5,7,4,6,1. Далее текст записывается в n столбцов, которые затем переставляются в соответствии с порядком задаваемым перестановкой. Ниже приведён пример:
как вид
но, сов
ершенст .......
Зашифрованный вид :
даквки
вонс,о
треншсе .........
Т.о. получем шифртекст: "даквки вонс,о треншсетово сдягитасегн тео гадк,о адж еу енгчое ирпаивб ьтн,о уокаг деежи чньоге лняязт но ьтд е(кес-нэт)юзрпие". Расшифрование осуществляется тем же самым образом, но используется другой ключ. Чтобы получить ключ расшифрования нужно зашифровать строку "1234567"; при этом мы получим "7215364".
вот код
Выдает ошибку Индекс и длина должны указывать на позицию в строке.
Имя параметра: length
в строке msgInArray[i] = msg.Substring(i * key.Length, key.Length);
Помогите додумать дальше,пожалуйста!как исправить ошибку?
public string Encrypt(string msg, char[] key)
{
string result = string.Empty;
string[] msgInArray = new string[(msg.Length / key.Length) + 1];
for (int i = 0; i < (msg.Length / key.Length) + 1; i++)
{
if (msg.Length <= key.Length)
{
msgInArray[i] = msg;
break;
}
else
{
msgInArray[i] = msg.Substring(i * key.Length, key.Length);
}
}
int[] a = new int[key.Length];
for (int i = 0; i < a.Length; i++)
{
a[i] = key[i]-48;
}
List<char> msgl = new List<char>();
for (int i = 0; i < msgInArray.Length; i++)
{
if (msgInArray[i] != null)
{
msgl = msgInArray[i].ToList<char>();
for (int j = 0; j < key.Length; j++)
{
result += msgl[a[j]];
}
msgl.Clear();
}
else
{
break;
}
}
return result;
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(Encrypt(textBox1.Text, textBox2.Text.ToCharArray()));
}Решение задачи: «Перестановочный шифр, исправить код»
textual
Листинг программы
public static string Encrypt(string msg, char[] key)
{
string result = string.Empty;
string[] msgInArray = new string[(msg.Length / key.Length) + 1];
for (int i = 0; i < (msg.Length / key.Length) + 1; i++)
{
if (msg.Length <= key.Length)
{
msgInArray[i] = msg;
break;
}
else
{
if((msg.Length-i*key.Length)>key.Length)
msgInArray[i] = msg.Substring(i * key.Length, key.Length);
else
msgInArray[i] = msg.Substring(i * key.Length, msg.Length - i * key.Length);
}
}
int[] a = new int[key.Length];
for (int i = 0; i < a.Length; i++)
{
a[i] = key[i] - 48;
}
List<char> msgl = new List<char>();
for (int i = 0; i < msgInArray.Length; i++)
{
if (msgInArray[i] != null)
{
msgl = msgInArray[i].ToList<char>();
if (msgl.Count==key.Length)
{
for (int j = 0; j < key.Length; j++)
result += msgl[a[j]];
msgl.Clear();
}
else
{
for (int j = 0; j< msgl.Count; j++)
result += msgl[j];
msgl.Clear();
}
}
else
{
break;
}
}
return result;
}