Шифр Плейфера - найти ошибку в коде - C#

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

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

подскажите, почему не работает, не могу найти таких пространств имен, код взят с буржуинского сайта
namespace EncryptionAlgorithms
{
    using System.Collections.Generic;
    using System.Linq;
    using System.ComponentModel.Composition;
 
    public class PlayFair 
    {
        string key;
 
        public PlayFair(string key)
        {
            this.key = key;
        }
 
        #region Public Methods
 
        public override string Encrypt(string plainText)
        {
            return Process(plainText, Mode.Encrypt);
        }
 
        public override string Decrypt(string cipherText)
        {
            return Process(cipherText, Mode.Decrypt);
        }
 
        #endregion
 
        #region Private Methods
 
        private string Process(string message, Mode mode)
        {
            //Key:Charcater
            //Value:Position
            Dictionary<char, string> characterPositionsInMatrix = new Dictionary<char, string>();
 
            //Key:Position
            //Value:Charcater
            Dictionary<string, char> positionCharacterInMatrix = new Dictionary<string, char>();
 
            FillMatrix(key.Distinct().ToArray(), characterPositionsInMatrix, positionCharacterInMatrix);
 
            if (mode == Mode.Encrypt)
            {
                message = RepairWord(message);
            }
 
            string result = "";
 
            for (int i = 0; i < message.Length; i += 2)
            {
                string substring_of_2 = message.Substring(i, 2);//get characters from text by pairs
                //get Row & Column of each character
                string rc1 = characterPositionsInMatrix[substring_of_2[0]];
                string rc2 = characterPositionsInMatrix[substring_of_2[1]];
 
                if (rc1[0] == rc2[0])//Same Row, different Column
                {
                    int newC1 = 0, newC2 = 0;
 
                    switch (mode)
                    {
                        case Mode.Encrypt://Increment Columns
                            newC1 = (int.Parse(rc1[1].ToString()) + 1) % 5;
                            newC2 = (int.Parse(rc2[1].ToString()) + 1) % 5;
                            break;
                        case Mode.Decrypt://Decrement Columns
                            newC1 = (int.Parse(rc1[1].ToString()) - 1) % 5;
                            newC2 = (int.Parse(rc2[1].ToString()) - 1) % 5;
                            break;
                    }
 
                    newC1 = RepairNegative(newC1);
                    newC2 = RepairNegative(newC2);
 
                    result += positionCharacterInMatrix[rc1[0].ToString() + newC1.ToString()];
                    result += positionCharacterInMatrix[rc2[0].ToString() + newC2.ToString()];
                }
 
                else if (rc1[1] == rc2[1])//Same Column, different Row
                {
                    int newR1 = 0, newR2 = 0;
 
                    switch (mode)
                    {
                        case Mode.Encrypt://Increment Rows
                            newR1 = (int.Parse(rc1[0].ToString()) + 1) % 5;
                            newR2 = (int.Parse(rc2[0].ToString()) + 1) % 5;
                            break;
                        case Mode.Decrypt://Decrement Rows
                            newR1 = (int.Parse(rc1[0].ToString()) - 1) % 5;
                            newR2 = (int.Parse(rc2[0].ToString()) - 1) % 5;
                            break;
                    }
                    newR1 = RepairNegative(newR1);
                    newR2 = RepairNegative(newR2);
 
                    result += positionCharacterInMatrix[newR1.ToString() + rc1[1].ToString()];
                    result += positionCharacterInMatrix[newR2.ToString() + rc2[1].ToString()];
                }
 
                else//different Row & Column
                {
                    //1st character:row of 1st + col of 2nd
                    //2nd character:row of 2nd + col of 1st
                    result += positionCharacterInMatrix[rc1[0].ToString() + rc2[1].ToString()];
                    result += positionCharacterInMatrix[rc2[0].ToString() + rc1[1].ToString()];
                }
            }
 
            return result;
        }
 
        private string RepairWord(string message)
        {
            string trimmed = message.Replace(" ", "");
            string result = "";
 
            for (int i = 0; i < trimmed.Length; i++)
            {
                result += trimmed[i];
 
                if (i < trimmed.Length - 1 && message[i] == message[i + 1])
                //check if two consecutive letters are the same
                {
                    result += 'x';
                }
            }
 
            if (result.Length % 2 != 0)//check if length is even
            {
                result += 'x';
            }
 
            return result;
        }
 
        private void FillMatrix(IList<char> key, Dictionary<char, string>
          characterPositionsInMatrix, Dictionary<string, char> positionCharacterInMatrix)
        {
            char[,] matrix = new char[5, 5];
            int keyPosition = 0, charPosition = 0;
            List<char> alphabetPF = alphabet.Keys.ToList();
            alphabetPF.Remove('j');
 
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    if (charPosition < key.Count)
                    {
                        matrix[i, j] = key[charPosition];//fill matrix with key
                        alphabetPF.Remove(key[charPosition]);
                        charPosition++;
                    }
 
                    else//key finished...fill with rest of alphabet
                    {
                        matrix[i, j] = alphabetPF[keyPosition];
                        keyPosition++;
                    }
 
                    string position = i.ToString() + j.ToString();
                    //store character positions in dictionary to avoid searching everytime
                    characterPositionsInMatrix.Add(matrix[i, j], position);
                    positionCharacterInMatrix.Add(position, matrix[i, j]);
                }
            }
        }
 
        private int RepairNegative(int number)
        {
            if (number < 0)
            {
                number += 5;
            }
 
            return number;
        }
 
        #endregion
    }
}

Решение задачи: «Шифр Плейфера - найти ошибку в коде»

textual
Листинг программы
public abstract class PlayFairSettings
{
    protected HashSet<char> HsAlphabet { get; private set; }
    protected Dictionary<char, char> Replaces { get; private set; }
 
    protected abstract char[] AlphabetChars { get; }
 
    /// <summary>Число столбцов в матрице</summary>
    public abstract int Columns { get; }
 
    /// <summary>Число строк в матрице</summary>
    public abstract int Rows { get; }
 
    /// <summary>Символ-заменитель</summary>
    public abstract char Replacer { get; }
 
    /// <summary>Алфавит</summary>
    public IEnumerable<char> Alphabet
    {
        get
        {
            char[] chars = AlphabetChars;
            foreach (var c in chars)
                yield return c;
        }
    }
 
    public PlayFairSettings()
    {
        HsAlphabet = new HashSet<char>();
        Replaces = new Dictionary<char, char>();
 
        // Переносим символы алфавита в хэштаблицу, чтобы 
        // убрать повторяющиеся значения и быстро определять
        // принадлежит символ алфавиту или нет
        foreach (var c in AlphabetChars)
            HsAlphabet.Add(c);
    }
 
    /// <summary>Возвращает символ после всех преобразований</summary>
    /// <remarks>Если символ не принадлежит алфавиту, будет поставлен Replacer.</remarks>
    public char GetChar(char Char)
    {
        Char = System.Char.ToLower(Char);
        Char = Replaces.ContainsKey(Char) ? Replaces[Char] : Char;
        return HsAlphabet.Contains(Char) ? Char : Replacer;
    }
}

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


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

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

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