Проблемы с шифром Цезаря - PullRequest
       8

Проблемы с шифром Цезаря

0 голосов
/ 25 октября 2018

У меня проблема с расшифровкой шифра Цезаря в C #.Мы должны сделать это вручную , зашифровать и расшифровать.Я хочу, чтобы он записал все возможности , сдвигая одну за другой (тогда легко увидеть правильное дешифрование, потому что другие 25 возможности бессмысленны).Проблема в том, что он пишет только одну возможность, а не 26.Я перепробовал все.У вас есть идеи, в чем проблема?

string text = "Z programovani{}{}{}";
text = text.ToUpper();
string output = "";
int shift = 3;

foreach (char a in text)
{
    int x = (int)a;
    if (x >= 65 && x <= 90)
    {
        x += shift;
    }
    if (x == 32)
    {
        x -= shift;
    }
    if (x >90)
    {
        x = x - 26;
    }

    output += (char)x;
}
Console.WriteLine(output);

int i = 0;
do
{
    string decoded = "";

    foreach (char a in output)
    {
        int x = (int)a;
        if (x >= 65 && x <= 90)
        {
            x += 1;
        }
        if (x > 90)
        {
            x = x + 26;
        }

        decoded += (char)x;
    }
    i++;
    Console.WriteLine(decoded);
} while (i < 27);

Console.ReadKey();

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Когда вы играете с Сайфером, часто возникает вопрос: «Как работать с буквой, которой нет в нашем базовом алфавите?».
Идея алфавита - это простой способ обработки диапазона [az AZ 09] и даже добавления пунктуации.Здесь мини-версия.

static string alphabet = "abcdefghijklmnopqrstuvwxyz";

Затем с помощью простой функции, чтобы разделить на простую задачу:
- ShiftChar, Shit Char в нашем алфавите с ключом шифра.
- Cypher, расшифровать слово.
-AllCypher, вычисли все шифры.

char ShiftChar(char letter, int key, StringComparison comparisonType = StringComparison.CurrentCulture)
    => alphabet[EuclydianModulo(AlphabetIndex(letter, comparisonType) + key, alphabet.Length)];

int EuclydianModulo(int dividend, int divisor) //As % computes the remainder, not the modulo
    => ((dividend % divisor) + divisor) % divisor;

string Cypher(string word, int key, StringComparison comparisonType = StringComparison.CurrentCulture)
    => new string(  // To Return a string from char Array
        word.Select(x => // If letter is not in the alphabet, Don't crypt that letter. 
             alphabet.IndexOf(word, comparisonType) >= 0 ? ShiftChar(x, key, comparisonType) : x
            ).ToArray()
       );

List<string> AllCypher(string word, StringComparison comparisonType = StringComparison.CurrentCulture)
    => Enumerable.Range(0, alphabet.Length)
                  // If word is null, string.Empty.
                 .Select(key => Cypher(word??string.Empty, key, comparisonType))
                 .ToList();

internal void TestCase_SO_52991034()
{
    var inputTest = new[] { "cake", "Ufhp rd gtc bnym knaj itejs qnvztw ozlx.", null };
    var result = inputTest.Select(x => new { word = x, cypher = AllCypher(x) });


    var ignoreCase = AllCypher("ABC", StringComparison.CurrentCultureIgnoreCase);
    var caseSentitiv =  AllCypher("ABC");

    var crypt = Cypher("FooBar Crypt me!", 42, StringComparison.CurrentCultureIgnoreCase);
    var decrypt = Cypher(crypt, alphabet.Length - 42);
}

Кроме того, Decrypt - это просто крипта, ключ которой alphabet.Length - key:

string Decypher(string word, int key, StringComparison comparisonType = StringComparison.CurrentCulture)
    => Cypher(word, alphabet.Length - key, comparisonType);
0 голосов
/ 25 октября 2018

Давайте извлечем метод (не втисните все в один Main; разложите ваше решение, сделайте его проще, проще для чтения и обслуживания):

private static string Caesar(string value, int shift) {
  if (null == value)
    return null;

  // Normalization: if we have shift out of [0..25] range, e.g. -3 or 125
  shift = ((shift % 26) + 26) % 26;

  StringBuilder sb = new StringBuilder(value.Length);

  foreach (var c in value) 
    if (c >= 'a' && c <= 'z')
      sb.Append((char)((c - 'a' + shift) % 26 + 'a')); 
    else if (c >= 'A' && c <= 'Z')
      sb.Append((char)((c - 'A' + shift) % 26 + 'A'));
    else
      sb.Append(c);

  return sb.ToString();
}

Тогда вы можете легко использовать его:

using System.Linq;

...

string text = "Z programovani{}{}{}";

// Let's use Linq; loop 
// for(int i = 0; i < 26; ++i) Console.WriteLine($"{i,2}: {Caesar(text, i)}");  
// is an alternative
string result = string.Join(Environment.NewLine, Enumerable
  .Range(0, 26)
  .Select(i => $"{i,2}: {Caesar(text, i)}"));

Console.Write(result);

Результат:

 0: Z programovani{}{}{}
 1: A qsphsbnpwboj{}{}{}
 2: B rtqitcoqxcpk{}{}{}
 3: C surjudprydql{}{}{}
 4: D tvskveqszerm{}{}{}
 5: E uwtlwfrtafsn{}{}{}
 6: F vxumxgsubgto{}{}{}
 7: G wyvnyhtvchup{}{}{}
 8: H xzwoziuwdivq{}{}{}
 9: I yaxpajvxejwr{}{}{}
10: J zbyqbkwyfkxs{}{}{}
11: K aczrclxzglyt{}{}{}
12: L bdasdmyahmzu{}{}{}
13: M cebtenzbinav{}{}{}
14: N dfcufoacjobw{}{}{}
15: O egdvgpbdkpcx{}{}{}
16: P fhewhqcelqdy{}{}{}
17: Q gifxirdfmrez{}{}{}
18: R hjgyjsegnsfa{}{}{}
19: S ikhzktfhotgb{}{}{}
20: T jlialugipuhc{}{}{}
21: U kmjbmvhjqvid{}{}{}
22: V lnkcnwikrwje{}{}{}
23: W moldoxjlsxkf{}{}{}
24: X npmepykmtylg{}{}{}
25: Y oqnfqzlnuzmh{}{}{}
...