2010-06-03 52 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