Перестановочный шифр, исправить код - C#

Узнай цену своей работы

Формулировка задачи:

Задание : В перестановочных шифрах меняется порядок следования символов. В простом перестановочном шифре в качестве ключа выбирается перестановка чисел от 0 до n. Например, для n=7 можно использовать перестановку 3,2,5,7,4,6,1. Далее текст записывается в n столбцов, которые затем переставляются в соответствии с порядком задаваемым перестановкой. Ниже приведён пример: как вид но, сов ершенст ....... Зашифрованный вид : даквки вонс,о треншсе ......... Т.о. получем шифртекст: "даквки вонс,о треншсетово сдягитасегн тео гадк,о адж еу енгчое ирпаивб ьтн,о уокаг деежи чньоге лняязт но ьтд е(кес-нэт)юзрпие". Расшифрование осуществляется тем же самым образом, но используется другой ключ. Чтобы получить ключ расшифрования нужно зашифровать строку "1234567"; при этом мы получим "7215364". вот код
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()));
        }
Выдает ошибку Индекс и длина должны указывать на позицию в строке. Имя параметра: length в строке msgInArray[i] = msg.Substring(i * key.Length, key.Length); Помогите додумать дальше,пожалуйста!как исправить ошибку?

Решение задачи: «Перестановочный шифр, исправить код»

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;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5