Силовая атака решетки Кардано - C#

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

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

Подскажите как можно подключить словарь слов dictionary.txt на полный перебор, по правилу: подставлять каждое слово по порядку в word (шифрование производится по первому вхождению каждой буквы слова в тексте), если имеется возможность вставить второе, третье и более слов после первого, вставляем. Иначе, если букв для слова не хватает пропускаем его, и выдаем все получившиеся варианты. Например, пекло+патрон; поп+патриот и т.д. У меня шифр решетки Кардано (без поворотов!) код шифрования и дешифрования:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
 
namespace ConsoleApplication4
{
    class Program
    {
        public static string word = "приветбрат!";
        public static string input = "ПеРгамент клеопатры Из египта отраВлЕн Токсином, Будь остоРожен с ним, цезАрь, Такова твоя учесть!";
 
        static void Main(string[] args)
        {
            Console.WriteLine("Шифруемое слово: " + word + "\n");
            Console.WriteLine("Криптограмма     : " + input + "\n");
            input = input.Replace(' ', '_');
            input = input.ToLower();
            Matrix();
            Console.WriteLine("\nКриптограмма: " + input);
            Console.WriteLine("\nКлюч        : " + Crypt(word, input));
            string key = Crypt(word, input);
            Console.Write("\nДешифровка  : ");
            DeCrypt(input, key);
            Console.ReadLine();
        }
 
        public static void Matrix()
        {
            Console.WriteLine("Матрица:");
            int b = 0;
            int c = input.Length / word.Length;
            if (input.Length % word.Length != 0)
            {
                int d = input.Length % word.Length;
                c++;
                int f = word.Length - d;
                input = input.PadRight(input.Length + f);
            }
 
            char[,] Matrix = new char[word.Length, c];
            for (int j = 0; j < c; j++)
            {
                for (int i = 0; i < word.Length; i++)
                {
                    Matrix[i, j] = input[b];
                    Console.Write("{0} ", Matrix[i, j]);
                    b++;
                }
                Console.WriteLine();
            }
        }
 
        static string Crypt(string word, string input)
        {
            var sb = new StringBuilder();
            int i = 0, j = 0;
            for (; i < word.Length; i++)
            {
                for (; j < input.Length; j++)
                {
                    if (word[i] == input[j])
                    {
                        sb.Append("1");
                        j++;
                        break;
                    }
                    sb.Append("0");
                }
            }
            for (; j < input.Length; j++)
                sb.Append("0");
 
            return sb.ToString();
        }
 
        static void DeCrypt(string input, string key)
        {
            key = Crypt(word, input);
            for (int i = 0; i < key.Length; i++)
            {
                if (Convert.ToString(key[i]) == "1")
                {
                    Console.Write(input[i]);
                }
            }
        }
    }
}

Решение задачи: «Силовая атака решетки Кардано»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
 
namespace ConsoleApplication4
{
    class Program
    {
        public static string word = "привет";
        public static string input = "ПеРгамент И перо отраВлЕно Токсином";
        public static StreamReader sr = new StreamReader(@"F:\dictionary.txt", Encoding.Default);
 
        static void Main(string[] args)
        {
            Console.WriteLine("Шифруемое слово: " + word + "\n");
            Console.WriteLine("Криптограмма: " + input + "\n");
            input = input.Replace(' ', '_');
            input = input.ToLower();
            Matrix();
            Console.WriteLine("\nКриптограмма: " + input);
            Console.WriteLine("\nКлюч        : " + Crypt(word, input));
            string key = Crypt(word, input);
            Console.WriteLine("\nДешифровка  : ");
            DeCrypt(input, key);
            Console.WriteLine("\nВзламываем  : ");
            Analize(input, key);
            Console.ReadKey();
        }
 
        public static void Matrix()
        {
            Console.WriteLine("Матрица:");
            int b = 0;
            int c = input.Length / word.Length;
            if (input.Length % word.Length != 0)
            {
                int d = input.Length % word.Length;
                c++;
                int f = word.Length - d;
                input = input.PadRight(input.Length + f);
            }
 
            char[,] Matrix = new char[word.Length, c];
            for (int j = 0; j < c; j++)
            {
                for (int i = 0; i < word.Length; i++)
                {
                    Matrix[i, j] = input[b];
                    Console.Write("{0} ", Matrix[i, j]);
                    b++;
                }
                Console.WriteLine();
            }
        }
 
        static string Crypt(string word, string input)
        {
            var sb = new StringBuilder();
            int i = 0, j = 0;
            for (; i < word.Length; i++)
            {
                for (; j < input.Length; j++)
                {
                    if (word[i] == input[j])
                    {
                        sb.Append("1");
                        j++;
                        break;
                    }
                    sb.Append("0");
                }
            }
            for (; j < input.Length; j++)
                sb.Append("0");
 
            return sb.ToString();
        }
 
        static void DeCrypt(string input, string key)
        {
            key = Crypt(word, input);
            for (int i = 0; i < key.Length; i++)
            {
                if (Convert.ToString(key[i]) == "1")
                {
                    Console.Write(input[i]);
                }
            }
        }
 
        static void Analize(string input, string key)
        {
            string[] src = sr.ReadToEnd().Split('\n');
            for (int i = 0; i < src.GetLength(0); i++)
            {
                key = Crypt(src[i], input);
                for (int j = 0; j < key.Length; j++)
                {
                    if (Convert.ToString(key[j]) == "1")
                    {
                        //if (input[j].Length != src[i].Length)
                        //{
                        //break;
                        //}
                        Console.Write(input[j]); 
                    }
 
                }
                Console.WriteLine();
            }
            Console.ReadKey();
        }
    }
}

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


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

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

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