当前位置: 首页 > 知识库问答 >
问题:

使用c语言的替换密码区分大小写#

丌官嘉勋
2023-03-14

我想使加密方法,将接受大写和小写的纯文本变量,如(“你好,世界)它只接受小写字母请帮助我,我想amke它是工作正常,只有小写字母作为输入请帮助我

            using System;

        class SubstitutionCipher
        {
           static void Main()
           {
              string key = "jfkgotmyvhspcandxlrwebquiz";
              string plainText = "the quick brown fox jumps over the lazy dog";
              string cipherText = Encrypt(plainText, key);
              string decryptedText = Decrypt(cipherText, key);
              Console.WriteLine("Plain     : {0}", plainText);
              Console.WriteLine("Encrypted : {0}", cipherText);
              Console.WriteLine("Decrypted : {0}", plainText);
              Console.ReadKey();
           }
    //encryption method 
           static string Encrypt(string plainText, string key)
           {
              char[] chars = new char[plainText.Length];
              for(int i = 0; i < plainText.Length; i++)
              {
                 if (plainText[i] == ' ')
                 {
                    chars[i] = ' ';
                 }   
                 else
                 {
                    int j = plainText[i] - 97;
                    chars[i] = key[j];
                 }
              }
              return new string(chars);
           }
//decryption method
           static string Decrypt(string cipherText, string key)
           {
              char[] chars = new char[cipherText.Length];
              for(int i = 0; i < cipherText.Length; i++)
              {
                 if (cipherText[i] == ' ')
                 {
                    chars[i] = ' ';
                 }   
                 else
                 {
                    int j = key.IndexOf(cipherText[i]) - 97;
                    chars[i] = (char)j;
                 }
              }
              return new string(chars);
           } 
        }

共有2个答案

尹冠宇
2023-03-14

您正在减去“a”,这只适用于小写字符。您应该检查它是大写还是小写,然后分别减去“a”或“a”。此外,您可以直接使用“a”或“A”来获得字符的等效形式。

我的意思是将此用于您的Decrypt和Encrypt语句:

    static string Encrypt(string plainText, string key)
    {
        char[] chars = new char[plainText.Length];
        for (int i = 0; i < plainText.Length; i++)
        {
            if (plainText[i] == ' ')
            {
                chars[i] = ' ';
            }
            else if (Char.IsUpper(plainText[i]))
            {
                int j = plainText[i] - 'A';
                chars[i] = key[j];
            }
            else
            {
                int j = plainText[i] - 'a';
                chars[i] = key[j];
            }
        }
        return new string(chars);

    static string Decrypt(string cipherText, string key)
    {
        char[] chars = new char[cipherText.Length];
        for (int i = 0; i < cipherText.Length; i++)
        {
            if (cipherText[i] == ' ')
            {
                chars[i] = ' ';
            }
            else if (Char.IsUpper(cipherText[i]))
            {
                int j = key.IndexOf(cipherText[i]) - 'A';
                chars[i] = (char)j;
            }
            else
            {
                int j = key.IndexOf(cipherText[i]) - 'a';
                chars[i] = (char)j;
            }
        }
        return new string(chars);
    }

或分别用于加密和解密的简短版本:

            else 
            {
                int j = Char.IsUpper(plainText[i]) ? plainText[i] - 'A' : plainText[i] - 'a';
                chars[i] = key[j];
            }

            else
            {
                int j = Char.IsUpper(cipherText[i]) ? key.IndexOf(cipherText[i]) - 'A' :  key.IndexOf(cipherText[i]) - 'a';
                chars[i] = (char)j;
            }

编辑:

好的,我认为算法已经基本完成,我刚刚修复了可能导致异常的部分。然而,你是:

a)不考虑哪个字母是大写的,b)没有一个工作的解密器。(我以为它起作用了,但是你的主要方法有明文结果作为解密消息)。

要修复解密程序,需要在加密程序上添加一种存储大写字母的方法。你可以更复杂一些,但现在,我们只需要在密文中将其加密为大写字母。

    static string Encrypt(string plainText, string key)
    {
        char[] chars = new char[plainText.Length];
        for (int i = 0; i < plainText.Length; i++)
        {
            if (plainText[i] == ' ')
            {
                chars[i] = ' ';
            }
            else 
            {
                int j = Char.IsUpper(plainText[i]) ? plainText[i] - 'A' : plainText[i] - 'a';
                chars[i] = Char.IsUpper(plainText[i]) ? Char.ToUpper(key[j]) : key[j];
            }
        }
        return new string(chars);

要解密,您应该在密钥中以小写字符的形式找到它,但以大写字符的形式输出。

    static string Decrypt(string cipherText, string key)
    {
        char[] chars = new char[cipherText.Length];
        for (int i = 0; i < cipherText.Length; i++)
        {
            if (cipherText[i] == ' ')
            {
                chars[i] = ' ';
            }
            else
            {
                int j = Char.IsUpper(cipherText[i]) ? key.IndexOf(Char.ToLower((char)cipherText[i])) + 'a' : key.IndexOf(cipherText[i]) + 'a';
                chars[i] = Char.IsUpper(cipherText[i]) ? Char.ToUpper((char)j) : (char)j;
            }
        }
        return new string(chars);
    }
尉迟雅昶
2023-03-14

这是一个有趣的问题,尤其是在一般情况下。所以我们有

  1. 密钥中的字符,这些字符应进行加密(例如aj

为了提高效率,让我们设计一个加密器\解密器作为字典

  key        = "jfkgo"
  sorted key = "fgjko"

这对将是

  {j, f} // when encrypting "j" becomes "f", on decryption "f" turns into "j"
  {f, g}
  {k, j}
  {g, k}
  {o, o}

从左向右读取时,我们有一个加密程序,从右向左读取时,我们有一个解密程序:

private static Dictionary<Char, Char> Encryptor(String key) {
  Char[] data = key.ToArray();
  Char[] sorted = data.OrderBy(c => c).ToArray();

  return data
    .Zip(sorted, (plain, encrypted) => new {
         Plain = plain,
         Encrypted = encrypted
     })
    .ToDictionary(item => item.Plain, item => item.Encrypted);
}

// Note, that Decryptor is the same as Encryptor by for the last line
private static Dictionary<Char, Char> Decryptor(String key) {
  Char[] data = key.ToArray();
  Char[] sorted = data.OrderBy(c => c).ToArray();

  return data
    .Zip(sorted, (plain, encrypted) => new {
      Plain = plain,
      Encrypted = encrypted
    })
    .ToDictionary(item => item.Encrypted, item => item.Plain);
}

现在,实现加密和解密方法很容易

private static String Encrypt(String source, String key) {
  var dict = Encryptor(key);

  StringBuilder Sb = new StringBuilder(source.Length);

  Char sub;

  foreach (var ch in source)
    if (dict.TryGetValue(ch, out sub))
      Sb.Append(sub);
    else
      Sb.Append(ch);

  return Sb.ToString();
}

 // Note, that Decryptor is the same as Encryptor by for the first line
private static String Decrypt(String source, String key) {
  var dict = Decryptor(key);

  StringBuilder Sb = new StringBuilder(source.Length);

  Char sub;

  foreach (var ch in source)
    if (dict.TryGetValue(ch, out sub))
      Sb.Append(sub);
    else
      Sb.Append(ch);

  return Sb.ToString();
}

小测验

 // For test, let capital letters mmimic the small ones
 string key = "jfkgotmyvhspcandxlrwebquiz" + "jfkgotmyvhspcandxlrwebquiz".ToUpper();

 string plainText = "The Quick Brown Fox Jumps Over The Lazy Dog!";
 string cipherText = Encrypt(plainText, key);
 string decryptedText = Decrypt(cipherText, key);

 Console.WriteLine("Plain     : {0}", plainText);
 Console.WriteLine("Encrypted : {0}", cipherText);
 Console.WriteLine("Decrypted : {0}", plainText);

 类似资料:
  • 问题内容: 使得更换不区分大小写似乎并不在下面的例子中(我要替换的效果 JR。 或 小 与 JR ): 为什么?我有什么误会? 问题答案: 该参数实际上是一种方便的选择。如果替换不是基于正则表达式的,则与替换无关。 因此,当时,这些是您可能的选择: 要么, 您还可以通过将不区分大小写标志作为模式的一部分纳入,而变得厚脸皮并绕过两个关键字参数。看到 注意 您将需要在正则表达式模式下转义句点,因为未转

  • 本文向大家介绍C语言实现密码本小项目,包括了C语言实现密码本小项目的使用技巧和注意事项,需要的朋友参考一下 一、引言 学C语言有一段时间了,趁着正好做了密码本的小项目,把它分享出来。 二、思路与原理 密码本,见名知意,就是存放账号密码,起到备忘录作用的本子,将需要备忘的数据通过加密存放在文本文件中,打开的文本文件为加密文本,需要通过软件查看已经存放的数据,提高安全性。(软件设计了启动密码,三次过后

  • 本文向大家介绍Objective-C语言不区分大小写与匹配子集的比较,包括了Objective-C语言不区分大小写与匹配子集的比较的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 我需要不区分大小写地突出显示JavaScript字符串中的给定关键字。 例如: 应该回来 我需要用于任何关键字的代码,因此使用像硬编码的正则表达式这样的解决方案还不够。 最简单的方法是什么? (这是标题中详述的更一般问题的实例,但我认为最好用一个具体,有用的示例来解决。) 问题答案: 你 可以 ,如果你准备搜索字符串使用正则表达式。在PHP中,例如有一个函数preg_quote,它用转

  • 本文向大家介绍C语言实现密码本,包括了C语言实现密码本的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现密码本的具体代码,供大家参考,具体内容如下 功能简述: 1.账号登陆(密码验证,三次锁定账号) 2.功能选择:1、查看所有密码 2、新增密码 3、删除密码 4、修改密码 5、查询密码 6、解除锁定 7、退出登陆 3.保存密码,文件加密 4.流程图: 数据定义部分 界面与用户