首页 > 解决方案 > 凯撒密码的问题

问题描述

我在 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();

标签: c#caesar-cipher

解决方案


让我们提取一个方法(不要将所有内容都塞进单个方法中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{}{}{}

推荐阅读