2010-06-03 51 views
12

我即将实现DSA algorithm,但有一个问题:C#随机BigInt有发电机

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

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

+5

标准注释:“这是研究/试验确定的,但你不敢使用,在生产”。 – 2010-06-03 12:09:05

+0

另请参阅[Chew Keong TAN的BigInteger类](http://www.weblearn.hs-bremen.de/risse/RST/WS06/single_vs_dual/sources/BigInteger.cs) – jww 2017-02-16 03:02:20

回答

15

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

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

BigInteger p = new BigInteger(bytes); 

的结果,当然,随机的,不一定是一个素数。在.NET 4.0框架中引入了BigInteger class


为了产生大的素数,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(); 
+0

@AakashM - 可能就足够了。猜测是获得素数的一个很好的策略,更不用提一个素数的随机数。 – Kobi 2010-06-03 12:08:15

+0

你为什么用8除?这是否确保它是64的倍数? – 2010-06-03 12:12:30

+2

我下降了,因为“随机”类对于加密目的不好。而你从维基的引用只会对如何制作主要素材有一点点的认识。 – Andrey 2010-06-03 12:15:41