2010-06-03 21 views
12

Estoy a punto de poner en práctica el DSA algorithm, pero hay un problema:C# A Bigint al azar generador de

elegir "p", un número primo con L bits, donde 512 < = L < = 1024 y L es un múltiplo de 64

¿Cómo puedo implementar un generador aleatorio de ese número? Int64 tiene "solo" 63 bits de longitud.

+5

comentario estándar: "Eso está bien para el estudio/la experimentación, pero no se atreve el uso que en la producción". –

+0

Ver también [Clase BigInteger de Chew Keong TAN] (http://www.weblearn.hs-bremen.de/risse/RST/WS06/single_vs_dual/sources/BigInteger.cs) – jww

Respuesta

15

se puede generar un número aleatorio con n bits utilizando este código:

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

BigInteger p = new BigInteger(bytes); 

El resultado es, por supuesto, al azar y no necesariamente un número primo.

El BigInteger class se introdujo en .NET 4.0 Framework.


para generar grandes números primos, Wikipedia says:

Para los números primos grandes utilizados en la criptografía, es habitual utilizar una forma modificada de tamizado: un rango elegido al azar de números impares de la el tamaño deseado se tamiza contra un número de primos impares relativamente pequeños (típicamente todos los primos menores de 65,000). Los primos candidatos restantes se prueban en orden aleatorio con una prueba de primalidad estándar tal como la prueba de primalidad Miller-Rabin para primos probables.

Por lo que podría hacer algo como esto:

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

@AakashM - Probablemente suficiente. Adivinar es una buena estrategia para obtener un número primo, sin mencionar un número aleatorio principal. – Kobi

+0

¿Por qué estás dividiendo entre 8? ¿Eso asegura que sea un múltiplo de 64? –

+2

bajé la votación porque la clase 'Random' no es buena para propósitos criptográficos. y su cita de wiki da solo un ligero sentido de cómo hacer primo. – Andrey