C# 随机 BigInt 生成器

发布于 2024-09-04 19:52:01 字数 265 浏览 11 评论 0原文

我即将实现 DSA 算法,但有一个问题:

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

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

I'm about to implement the DSA algorithm, but there is a problem:

choose "p", a prime number with L bits, where 512 <= L <= 1024 and L is a multiple of 64

How can I implement a random generator of that number? Int64 has "only" 63 bits length.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独夜无伴 2024-09-11 19:52:01

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

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

BigInteger p = new BigInteger(bytes);

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

BigInteger 类 是在 . NET 4.0框架。


为了生成大素数,维基百科说

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

所以你可以这样做:

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

You can generate a random number with n bits using this code:

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

BigInteger p = new BigInteger(bytes);

The result is, of course, random and not necessarily a prime.

The BigInteger class was introduced in the .NET 4.0 Framework.


For generating large prime numbers, Wikipedia says:

For the large primes used in cryptography, it is usual to use a modified form of sieving: a randomly-chosen range of odd numbers of the desired size is sieved against a number of relatively small odd primes (typically all primes less than 65,000). The remaining candidate primes are tested in random order with a standard primality test such as the Miller-Rabin primality test for probable primes.

So you could do something like this:

var p = Enumerable.Range(0, numberOfCandidates)
                  .Select(i => RandomOddNumber(bits))
                  .Where(x => !primesLessThan65000.Contains(x))
                  .Where(x => PrimalityTest(x))
                  .FirstOrDefault();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文