走过一些cryptogtaphy的东西,我看到RNGCryptoServiceProvider有两种方法:
RNGCryptoServiceProvider.GetNonZeroBytes
Run Code Online (Sandbox Code Playgroud)
和
RNGCryptoServiceProvider.GetBytes
Run Code Online (Sandbox Code Playgroud)
所以我问:
用一个加密强大的随机值序列填充一个字节数组是多么奇怪,其中一些(0或更多)是零? (它是随机值,显然不会有很多零,仍然为零也是常规数字)
为什么他们创造了区别?
我目前正在创建一个随机密码是这样的:
public static int getRandomNumber(int maxNumber)
{
if (maxNumber < 1)
throw new System.Exception("The maxNumber value should be greater than 1");
byte[] b = new byte[4];
new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);
int seed = (b[0] & 0x7f) << 24 | b[1] << 16 | b[2] << 8 | b[3];
System.Random r = new System.Random(seed);
return r.Next(1, maxNumber);
}
Run Code Online (Sandbox Code Playgroud)
一些可能的问题?这是一个静态函数,有一些奇怪的种子模式可能不安全,仍然使用System.Random().
使用上面的随机数生成器,我以这种低效的方式创建一个字符串:
validCharacters = "abcdefghjkmnoxyz023456789#!@";
Run Code Online (Sandbox Code Playgroud)
然后使用有效数组循环并获取"createPassword(length)"类型字符串(注意使用不包含容错字符的字符集,如1 i等).
这是如何做到的,还是有更简单,更安全,更有效的方式?
Bridge的游戏是用52种不同的扑克牌进行的,这些扑克牌随机分布在四个玩家中,每个玩家最终得到13张牌:一个所谓的"交易".大概少于2 ^ 96的Bridge交易是可能的.在本文档中,生成随机交易的程序的要求描述如下:
- 该软件应该能够生成所有可能的桥接协议,因为这也可以通过手动处理实现.
- 软件应该以相同的概率生成每笔交易,而不受董事会编号,之前的手或任何其他情况的影响.
- 即使在会议中看到所有其他交易之后,也无法预测交易.
本文继续说明伪随机生成器不能用于生成交易,因为看到伪随机序列的第一个元素将使得计算所使用的种子成为可能,从而使黑客能够预测将要跟随的交易.
此外,由于大多数伪随机生成器采用32位的种子,因此应该遵循这些生成器将能够产生最多2 ^ 32个不同的桥接交易,而不是所需的2 ^ 96,并且遵循所谓的生日悖论,在2 ^ 32交易的平方根之后,很可能会产生相同的交易.
描述Bridge交易生成应用程序要求的文档的作者编写了一个程序,在世界范围内用于生成随机交易,使用键盘上的人类输入生成96位种子.十四年来,这种方法没有出现任何缺陷.
我想编写一个例程,放弃使用人工输入来生成所需种子的需要.
来了RNGCryptoServiceProvider.我使用下面的代码生成随机数,首先在1到52的范围内,然后在1到51的范围内,依此类推,直到剩下一张卡.
测试得到的交易我非常有信心这个代码能够以相同的概率产生任何交易能力,并且任何卡结束四个玩家之一的机会等于0.25.
但由于我不知道RNGCryptoServiceProvider中使用的种子的强度,我想知道是否:
编辑 获得此问题中先前提到的随机数的方法存在缺陷.如果这个代码能够产生2 ^ 96个不同的Bridge交易,这就分散了主要问题.我将随机数发生器替换为Stephen Taub和Shawn Farkas在MSDN杂志上发布的那个
用于生成加密安全随机数的代码,范围为1-52,1-51,依此类推,最高可达1-2,取自本网站
/// <summary>
/// Returns a random number within a specified range.
/// </summary>
/// <returns>
/// A 32-bit signed integer greater than or equal to <paramref name="minValue"/> and less than <paramref name="maxValue"/>; that is, the range of return …Run Code Online (Sandbox Code Playgroud) 我在google上搜索RNGCryptoServiceProvider,其中包含如何限制Max和Min之间范围的示例,并且仍能获得均匀分布.在我使用模运算符之前,但有时我得到奇怪的值(高于Max)...无论如何这个代码(信用到未知)种子随机使用来自RNGCCryptoServiceProvider的新种子,每次调用该方法.你们有什么感想?
public static int GetRandom(int min, int max)
{
byte[] b = new byte[sizeof(int)];
new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);
int i = BitConverter.ToInt32(b, 0);
Random r = new Random(i);
return r.Next(min, max);
}
Run Code Online (Sandbox Code Playgroud)