C# 加扰和解扰文本

C# Scramble & Descramble Text

我已经有了这个方法来打乱我的文字,但我不知道如何打乱它?

        string input = "https://www.google.de/";
        char[] chars = input.ToArray();
        Random r = new Random(259);
        for (int i = 0; i < chars.Length; i++)
        {
            int randomIndex = r.Next(0, chars.Length);
            char temp = chars[randomIndex];
            chars[randomIndex] = chars[i];
            chars[i] = temp;
        }
        new string(chars);

        Console.WriteLine(chars);
        Console.ReadKey();

我不太擅长这些与数字和计算有关的事情,如果有人能帮助我,这样的事情会很好。

我已经搜索过 Functions,但找不到包含我理解的示例的函数。

//编辑:

-我如何制作一个打乱或随机播放功能,用特定数字打乱文本,以便每次都以相同的方式打乱文本?

-之后我该如何解开它?

只需向后做同样的事情(您需要以相反的顺序使用来自同一种子的相同随机数,因此首先将它们放在列表中):

        string input = "https://www.google.de/";
        char[] chars = input.ToArray();
        Random r = new Random(259);
        for (int i = 0; i < chars.Length; i++)
        {
            int randomIndex = r.Next(0, chars.Length);
            char temp = chars[randomIndex];
            chars[randomIndex] = chars[i];
            chars[i] = temp;
        }
        string scrambled = new string(chars);

        Console.WriteLine(chars);
        Console.ReadKey();

        r = new Random(259);
        char[] scramChars = scrambled.ToArray();
        List<int> swaps = new List<int>();
        for (int i = 0; i < scramChars.Length; i++)
        {
            swaps.Add(r.Next(0, scramChars.Length));
        }
        for (int i = scramChars.Length - 1; i >= 0; i--)
        {
            char temp = scramChars[swaps[i]];
            scramChars[swaps[i]] = scramChars[i];
            scramChars[i] = temp;
        }

        string unscrambled = new string(scramChars);

        Console.WriteLine(scramChars);

我过去曾使用自己的 scramble/unscramble 方法以另一种方式完成,但最近发现一些字符串只是不加扰我没有使用交换,而是一种编码形式。 我找到了这个线程并采用了最后提供的解决方案,并通过将种子编码到加扰字符串中使其更有用,因此不需要解码种子。 这允许在数据库中使用加扰的字符串来混淆它以便于阅读。 除非你知道种子在字符串中的嵌入位置(目前是最后一个字符,但如果需要,你可以将其作为字符串的任何部分)

    /// <summary>
    /// Mix up a string (re-order character positions) using a random number set based from a seed value
    /// </summary>
    /// <param name="StringToScramble"></param>
    /// <returns>Scrambled String with seed encoded</returns>
    public static string RandomizeString(string StringToScramble)
    {
        int seed = RandomNumber(0, 250);  // Get a random number (will be encoded into string , this will be the seed
        Random r = new Random(seed);
        char[] chars = StringToScramble.ToArray();

        for (int i = 0; i < StringToScramble.Length; i++)
        {
            int randomIndex = r.Next(0, StringToScramble.Length);   // Get the next random number from the sequence
            Debug.Print(randomIndex.ToString());
            char temp = chars[randomIndex]; // Copy the character value
            // Swap them around
            chars[randomIndex] = chars[i];
            chars[i] = temp;

        }
        // Add the seed            
        return new string(chars) + seed.ToString("X").PadLeft(2, '0');
    }
    /// <summary>Unscramble a string that was previously scrambled </summary>
    /// <param name="ScrambledString">String to Unscramble</param>
    /// /// <returns>Unscrambled String</returns>
    public static string UnRandomizeString(string ScrambledString)
    {
        try
        { 
            // Get the last character from the string as this is the random number seed
            int seed = int.Parse(ScrambledString.Substring(ScrambledString.Length - 2), System.Globalization.NumberStyles.HexNumber);              
            Random r = new Random(seed);
            char[] scramChars = ScrambledString.Substring(0, ScrambledString.Length - 2).ToArray();
            List<int> swaps = new List<int>();
            for (int i = 0; i < scramChars.Length ; i++)
            {
                int randomIndex = r.Next(0, scramChars.Length );
                swaps.Add(randomIndex);
            }
            for (int i = scramChars.Length - 1; i >= 0; i--)
            {
                char temp = scramChars[swaps[i]];
                scramChars[swaps[i]] = scramChars[i];
                scramChars[i] = temp;
            }

            return new string(scramChars); 
            
        }

        catch (System.Exception ex)
        {
            return "";
        }
    }