
НА ПАСКАЛЕ ИЛИ НА C# Известно, что текст на русском языке зашифрован шифром Цезаря. При этом
использован следующий набор букв:А б в г д е ж з и к л м н о п р с т у ф х ц ч ш щ ь ы ъ э ю яВ исходном тексте буква Й заменяется буквой И.Нужно расшифровать заданный текст методом прямого перебора возможных вариантов. Смещение неизвестно, поэтому для расшифровки нужно составить варианты текста со всеми параметрами сдвига. Это значит, что первый вариант текста будет со сдвигом букв на 1, второй – со сдвигом букв на 2, и т.д. Вариант, который даст осмысленный исходный текст, и является искомым.Текст для расшифровки: БЛЫЪШЪЧЕРЯЛЬЛФЪРЬУЫЪУФУЪРФЫЪШН

Ответы на вопрос

Ответ:
// C# 7.3
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
var crypted = "БЛЫЪШЪЧЕРЯЛЬЛФЪРЬУЫЪУФУЪРФЫЪШН";
for (int i = 0; i < CaesarCipher.Ru.Length; i++)
Console.WriteLine(CaesarCipher.Decode(i, crypted));
}
}
class CaesarCipher
{
public static readonly string Ru = "aбвгдежзиклмнопрстуфхцчшщьыъэюя";
public static readonly string RuD = "aбвгдежзиклмнопрстуфхцчшщьыъэюяaбвгдежзиклмнопрстуфхцчшщьыъэюя";
private static readonly int defaultStep = 3;
public static CaesarEncrypted Encode(int step, string source, Func<string, string> translate)
{
string translatedData = translate(source);
var stringBuilder = new StringBuilder();
foreach (char c in translatedData.ToLower())
{
stringBuilder.Append(RuD[Ru.IndexOf(c) + step]);
}
return new CaesarEncrypted(step, stringBuilder.ToString());
}
public static CaesarEncrypted Encode(int step, string source)
{
return Encode(step, source, x => x);
}
public static string Decode(CaesarEncrypted source)
{
var step = source.Step;
return Encode(-step + Ru.Length, source.ToString(), x => x);
}
public static string Decode(int step, string source)
{
return Encode(-step + Ru.Length, source, x => x);
}
}
class CaesarEncrypted : IEnumerable, IEnumerable<char>
{
public int Step { get; set; }
public string Data { get; set; }
public CaesarEncrypted(int step, string initData)
{
Step = step;
Data = initData;
}
public CaesarEncrypted(string initData) : this(int.MaxValue, initData)
{}
public IEnumerator<char> GetEnumerator()
{
foreach (char c in Data)
yield return c;
}
IEnumerator IEnumerable.GetEnumerator() => (IEnumerator<char>)GetEnumerator();
public override string ToString() => Data;
public static implicit operator string(CaesarEncrypted source) => source.ToString();
}
}



Вы можете написать программу для расшифровки текста с использованием метода прямого перебора в языках программирования Pascal или C#. Ниже представлен пример решения на C#:
csharpusing System;
class Program
{
static void Main()
{
string encryptedText = "БЛЫЪШЪЧЕРЯЛЬЛФЪРЬУЫЪУФУЪРФЫЪШН";
Console.WriteLine("Возможные расшифрованные варианты:");
for (int shift = 1; shift <= 32; shift++) // Перебираем все возможные сдвиги (от 1 до 32)
{
string decryptedText = Decrypt(encryptedText, shift);
Console.WriteLine($"Сдвиг {shift}: {decryptedText}");
}
}
static string Decrypt(string text, int shift)
{
char[] decryptedChars = new char[text.Length];
for (int i = 0; i < text.Length; i++)
{
char encryptedChar = text[i];
char decryptedChar;
if (encryptedChar == 'Й') // Замена 'Й' на 'И'
{
decryptedChar = 'И';
}
else if (char.IsLetter(encryptedChar))
{
char baseChar = char.IsLower(encryptedChar) ? 'а' : 'А'; // Определение базовой буквы ('а' или 'А')
int index = (encryptedChar - baseChar - shift + 32) % 32; // Расшифровка с учетом сдвига
decryptedChar = (char)(baseChar + index);
}
else
{
decryptedChar = encryptedChar; // Символы, не являющиеся буквами, остаются без изменений
}
decryptedChars[i] = decryptedChar;
}
return new string(decryptedChars);
}
}
Программа перебирает все возможные сдвиги от 1 до 32 и выводит расшифрованный текст для каждого из них. Искомый текст будет тем, который имеет осмысленное значение, и вы сможете его легко идентифицировать.


Похожие вопросы
Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili