【发布时间】:2011-02-27 06:51:54
【问题描述】:
【问题讨论】:
-
标准评论:“学习/实验没问题,但你不敢在生产中使用它”。
标签: c# biginteger dsa
【问题讨论】:
标签: c# biginteger dsa
您可以使用以下代码生成带有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();
【讨论】:
Random 类不适合加密目的。并且您从 wiki 中引用的内容只是对如何制作素数只有一点点了解。
RandomNumberGenerator.Create() 比 new RNGCryptoServiceProvider 更可取吗?
00 字节作为MSB 以便符号始终为正吗?