gpt4 book ai didi

c# - 如何在 C# 程序中生成一组随机字符串,以便不轻易预测它们?

转载 作者:太空狗 更新时间:2023-10-30 00:12:39 26 4
gpt4 key购买 nike

我遇到了以下问题:从受限制的字母表中生成 N 个唯一的字母数字字符串。这是我在 C# 中的解决方案:

string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random generator = new Random();
const int ToGenerate = 10000;
const int CharactersCount = 4;
ArrayList generatedStrings = new ArrayList();
while( generatedStrings.Count < ToGenerate ) {
string newString = "Prefix";
for( int i = 0; i < CharactersCount; i++ ) {
int index = generator.Next( Alphabet.Length );
char character = Alphabet[index];
newString += character;
}
if( !generatedStrings.Contains( newString ) ) {
generatedStrings.Add( newString );
}
}
for( int i = 0; i < generatedStrings.Count; i++ ) {
System.Console.Out.WriteLine( generatedStrings[i] );
}

它生成 10K 字符串,以“Prefix”开头,否则由大写字母和数字组成。输出看起来不错。

现在我看到以下问题。生成的字符串适用于任何人都不可能预测到的情况。在我的程序中,种子是时间相关的。一旦有人知道种子值,他就可以运行相同的代码并获得完全相同的字符串。如果他知道任何两个字符串,他可以轻松找出我的算法(因为它真的很幼稚)并尝试暴力破解种子值 - 只需枚举所有可能的种子值,直到他在输出中看到两个已知字符串。

是否可以对我的代码进行一些简单的更改以减少所描述的攻击的可能性?

最佳答案

那么,他怎么会知道种子呢?除非他知道您运行代码的确切时间,否则非常很难做到。但是,如果您需要更强的随机数,您还可以通过 System.Security.Cryptography.RandomNumberGenerator.Create 创建加密强度高的随机数 - 例如:

        var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
byte[] buffer = new byte[4];
char[] chars = new char[CharactersCount];
for(int i = 0 ; i < chars.Length ; i++)
{
rng.GetBytes(buffer);
int nxt = BitConverter.ToInt32(buffer, 0);
int index = nxt % Alphabet.Length;
if(index < 0) index += Alphabet.Length;
chars[i] = Alphabet[index];
}
string s = new string(chars);

关于c# - 如何在 C# 程序中生成一组随机字符串,以便不轻易预测它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3307275/

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