代码之家  ›  专栏  ›  技术社区  ›  0xdw thommie

C#简单的加密/解密算法

  •  0
  • 0xdw thommie  · 技术社区  · 3 年前

    我当时正在研究简单的加密,但却被它的一条规则卡住了。

    规则是,

    1. 加密的工作原理是在每个字符上加5。
    2. 仅加密 a-z A-Z ,所有其他字符将按原样添加到加密字符串中。
    3. 如果角色是 z Z ,添加从字符开始 a
    4. 通过以相反的方式执行上述加密,也应当存在描述。

    我可以进行加密,但第三条规则是我在解密时遇到的问题。

    下面是我尝试过的代码,

    # Encrypt
    Input  : Dinindu-12Z
    Output : Insnsiz-12F
    
    # Decrypt
    Input  : Insnsiz-12F
    Output : Dinindu-12Z # This is the expected output, but got "Dinind\-12A"
    
    using System;
    
    class Program
    {
        public static String encrypt(String input)
        {
            String output = "";
            foreach (char c in input)
            {
                if (char.IsLetter(c))
                {
                    char cc = c;
                    if (c == 'z') cc = 'a';
                    if (c == 'Z') cc = 'A';
                    output += (char)(((int)cc) + 5);
                }
                else
                {
                    output += c;
                }
            }
            return output;
        }
    
        public static string decrypt(String input)
        {
            String output = "";
            foreach (char c in input)
            {
                if (char.IsLetter(c))
                {
                    char cc = c;
                    if (c == 'z') cc = 'a';
                    if (c == 'Z') cc = 'A';
                    output += (char)(((int)cc) - 5);
                }
                else
                {
                    output += c;
                }
            }
            return output;
        }
    
        public static void Main(string[] args)
        {
            String a = encrypt("Dinindu-12Z");
            String b = decrypt(a);
            Console.WriteLine(a);
            Console.WriteLine(b);
        }
    }
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   John    3 年前

    您应该编写一个方法来接受 char 数组,并获取高级索引处的元素。你可以使用模( % )操作员推进和包裹,例如。

    private static char GetCharWithStepAndWrap(char[] chars, char ch, int step)
    {
        var index = Array.IndexOf(chars, ch);
    
        index += step;
        index %= chars.Length;
    
        return chars[index];
    }
    

    添加 step 值将推进索引,可能超过数组的末尾。然后,模将把索引除以 Length 并使用余数。这意味着,如果索引在数组中开始,它将停留在原来的位置,如果它超过了数组的末尾,则实际上减去了 从开始到结束。

    然后,您可以将该方法与 烧焦 数组来自 a z 加密,然后简单地反转数组进行解密,例如。

    static void Main(string[] args)
    {
        var chars = Enumerable.Range(Convert.ToInt32('a'), 26).Select(Convert.ToChar).ToArray();
        var plainText = "Dinindu-12Z";
        var encryptedText = string.Empty;
    
        for (var i = 0; i < plainText.Length; i++)
        {
            var ch = plainText[i];
    
            if (char.IsLetter(ch))
            {
                var isUpper = char.IsUpper(ch);
    
                ch = char.ToLower(ch);
                ch = GetCharWithStepAndWrap(chars, ch, 5);
    
                if (isUpper)
                {
                    ch = char.ToUpper(ch);
                }
            }
    
            encryptedText += ch;
        }
    
        Console.WriteLine(encryptedText);
    
        Array.Reverse(chars);
    
        var decryptedText = string.Empty;
    
        for (var i = 0; i < plainText.Length; i++)
        {
            var ch = encryptedText[i];
    
            if (char.IsLetter(ch))
            {
                var isUpper = char.IsUpper(ch);
    
                ch = char.ToLower(ch);
                ch = GetCharWithStepAndWrap(chars, ch, 5);
    
                if (isUpper)
                {
                    ch = char.ToUpper(ch);
                }
            }
    
            decryptedText += ch;
        }
    
        Console.WriteLine(decryptedText);
    }
    

    如果您尝试该代码,您会注意到正确的加密文本是“Insnsiz-12E”。