C#随机BigInt生成器

时间:2010-06-03 12:02:32

标签: c# biginteger dsa

我即将实施DSA algorithm,但有一个问题:

  

选择“p”,一个带有L位的素数,其中512 <= L <= 1024且L是64的倍数

如何实现该数字的随机生成器? Int64“只有”63位长度。

1 个答案:

答案 0 :(得分:15)

您可以使用以下代码生成n位的随机数:

var rng = new RNGCryptoServiceProvider();
byte[] bytes = new byte[n / 8];
rng.GetBytes(bytes);

BigInteger p = new BigInteger(bytes);

结果当然是随机的,不一定是素数。

.NET 4.0 Framework中引入了BigInteger class


为了生成大素数,Wikipedia says

  

对于密码学中使用的大质数,通常使用修改形式的筛选:随机选择的所需大小的奇数范围被筛分对多个相对较小的奇数素数(通常所有素数小于65000)。其余的候选素数以随机顺序进行测试,并进行标准素性测试,例如可能素数的米勒 - 拉宾素数检验。

所以你可以这样做:

var p = Enumerable.Range(0, numberOfCandidates)
                  .Select(i => RandomOddNumber(bits))
                  .Where(x => !primesLessThan65000.Contains(x))
                  .Where(x => PrimalityTest(x))
                  .FirstOrDefault();