【问题标题】:C# A random BigInt generatorC# 随机 BigInt 生成器
【发布时间】:2011-02-27 06:51:54
【问题描述】:

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

选择“p”,一个有 L 位的素数,其中 512

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

【问题讨论】:

标签: c# biginteger dsa


【解决方案1】:

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

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

BigInteger p = new BigInteger(bytes);

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

BigInteger class 是在 .NET 4.0 框架中引入的。


用于生成大素数,Wikipedia says:

对于密码学中使用的大素数,通常使用一种改进的筛选形式:随机选择的所需大小的奇数范围与一些相对较小的奇素数(通常所有素数小于65,000)。剩余的候选素数通过标准素数测试(例如 Miller-Rabin 素数测试)以随机顺序进行测试。

所以你可以这样做:

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

【讨论】:

  • @AakashM - 很可能。猜测是获得质数的好策略,更不用说质数随机数了。
  • 为什么要除以 8?这是否确保它是 64 的倍数?
  • 我投了反对票,因为Random 类不适合加密目的。并且您从 wiki 中引用的内容只是对如何制作素数只有一点点了解。
  • @Henk Holterman:RandomNumberGenerator.Create()new RNGCryptoServiceProvider 更可取吗?
  • 您不需要添加一个00 字节作为MSB 以便符号始终为正吗?
猜你喜欢
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多