我是.NET和C#的新手,我正在试图弄清楚这段代码的工作原理:
public static string CreateRandomPassword(int PasswordLength)
{
String _allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ23456789";
Byte[] randomBytes = new Byte[PasswordLength];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randomBytes);
char[] chars = new char[PasswordLength];
int allowedCharCount = _allowedChars.Length;
for(int i = 0;i<PasswordLength;i++)
{
///
/// I don't understand how this line works:
///
chars[i] = _allowedChars[(int)randomBytes[i] % allowedCharCount];
}
return new string(chars);
}
我认为我对大部分内容都有很好的处理。我无法理解以下内容:
chars[i] = _allowedChars[(int)randomBytes[i] % allowedCharCount];
我知道代码会生成随机二进制数,并在for循环中使用这些随机数从_allowedChars字符串中选择一个字符。我没有得到的是为什么这段代码使用modulous运算符(%)来获取_allowedChars索引值。
感谢您的帮助
答案 0 :(得分:5)
这只是一个侧面说明,但该代码被巧妙地打破了。用于选择要选择哪个字符的模数运算符(%)不是统一的:它会比其他字符更喜欢某些字符(靠近数组前面的字符),这意味着密码不是真正随机的。攻击者可以先使用它来尝试更高概率的密码,并大大减少完成破解所需的时间。
答案 1 :(得分:3)
randomBytes [i]的值可以是0到255之间的任何整数._allowedChars数组的长度小于255.模块运算符返回除第一个参数的余数((int)randomBytes [i])通过第二个参数(allowedCharCount)。这确保了我们索引_allowedChars数组的值(模运算符的结果)总是小于allowedCharacterCount。
答案 2 :(得分:0)
它使用模数运算符,因为randomBytes[i]
可以保存一个大于_allowedChars
数组长度的值。
使用% allowedCharCount
可确保_allowedChars
的索引始终在范围内。否则,代码可能会在该行上引发异常。
答案 3 :(得分:0)
您正在使用modulo allowedCharCount
,这可确保生成的数字介于0和allowedCharCount
之间,因此不会抛出IndexOutOfRange
个异常。
答案 4 :(得分:0)
使用mod确保数字介于0和allowedCharCount
之间 - 它可以防止索引超出范围异常。没有它,您必须限制随机生成的数字的范围,这是加密提供程序无法实现的。这也意味着您可以在不破坏代码的情况下更改字符串中允许的字符列表。
答案 5 :(得分:-1)
2%5=3
4%5=1
6%5=1
15%5=0
16%5=1
保证0-5之间的任何结果 如果将5替换为任何其他数字( n ),您将获得类似的保证,结果将介于0- n 之间。