gpt4 book ai didi

c# - 如何使用密码在 VB.NET(或 C#)中使用 "randomize"颜色数组?

转载 作者:行者123 更新时间:2023-12-02 15:39:16 27 4
gpt4 key购买 nike

我有一个包含很多“颜色”的数组,我想更改这些颜色的顺序(随机)但需要密码:这样另一个用户就可以获得数组的“原始”(和正确)序列只有使用正确的密码。我如何在 Visual Basic .NET 或 C# 中执行此操作?我必须使用特定的加密引擎吗?

最佳答案

这是一个使用密码来打乱颜色数组的简单方法。

关键是将您的密码从字符串转换为数字。然后,您可以将该数字用作随机数生成器的种子。之后,您可以使用该随机数生成器来获得 permutation。与颜色数组的长度相同。您可以使用该排列来更改颜色的顺序并打乱数组。

解密时,如果给定相同的密码,就可以生成相同的排列,将数组解密成原来的形式。

这是该原则的示例,用 C# 编写:

int[] GetPermutation(int size, int seed)
{
Random random = new Random(seed);
int[] array = new int[size];
for (int i = 0; i < size; i++)
array[i] = i;
for (int i = array.Length; i > 1; i--)
{
int j = random.Next(i);
int tmp = array[j];
array[j] = array[i - 1];
array[i - 1] = tmp;
}
return array;
}

Color[] Encrypt(Color[] input, string password)
{
int seed = password.GetHashCode();
int[] perm = GetPermutation(input.Length, seed);
Color[] encrypted = new Color[input.Length];
for (int i = 0; i < input.Length; i++)
{
encrypted[perm[i]] = input[i];
}
return encrypted;
}

Color[] Decrypt(Color[] input, string password)
{
int seed = password.GetHashCode();
int[] perm = GetPermutation(input.Length, seed);
Color[] decrypted = new Color[input.Length];
for (int i = 0; i < input.Length; i++)
{
decrypted[i] = input[perm[i]];
}
return decrypted;
}

GetPermutation 函数根据作为参数传递的种子生成排列。 EncryptDecrypt 函数实际上是对数组进行加扰和解密。

这是一个用法示例:

Color[] array = new Color[5] { Color.Red, Color.Green, Color.Blue, Color.Yellow, Color.Black };
string password = "secret";
Color[] enc = Encrypt(array, password); // will always return Blue, Green, Black, Yellow, Red for the "secret" password
Color[] dec = Decrypt(enc, password); // will return the original array: Red, Green, Blue, Yellow, Black if given the "secret" password
Color[] dec2 = Decrypt(enc, "incorrectpwd"); // will return Green, Blue, Yellow, Black, Red, which is incorrect because the password was incorrect

注意事项:

  • 为简单起见,我使用了 .GetHashCode() 方法。此方法可能会在 .NET 框架的 future 版本中为同一字符串生成不同的数字
  • 如果数组长度较小,可以用不同的密码得到相同的加密顺序,即使密码不正确也能解密成功。例如:

    Color[] array = new Color[2] {Color.Red, Color.Green};
    Color[] enc = Encrypt(array, "one"); // will return Green, Red
    Color[] dec = Decrypt(enc, "one"); // will return Red, Green
    Color[] dec2 = Decrypt(enc, "two"); // will also return Red, Green, even though the password was incorrect
  • 如果您想使用颜色代替密码,您必须注意,您会失去一些安全性,因为所有密码的空间都没有由字符、数字和符号组成的密码高。暴力破解这样的密码会容易得多。

关于c# - 如何使用密码在 VB.NET(或 C#)中使用 "randomize"颜色数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10840232/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com