我过去曾使用自己的加扰/解扰方法以另一种方式进行,但最近发现一些字符串只是不加扰我没有使用交换,而是一种编码形式。我找到了这个线程并采用了最后提供的解决方案,并通过将种子编码到加扰字符串中使其更有用,因此不需要对种子进行解码。这允许在数据库中使用加扰字符串以使其易于阅读。除非您知道种子在字符串中的嵌入位置(当前是最后一个字符,但如果需要,您可以将其设为字符串的任何部分)
/// <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 "";
}
}