2010-09-18 28 views
6

tengo los valores para p, q, n y e y me gustaría para calcular la clave privada d. ¿Cómo puedo hacer esto? ¿Podría alguien darme el código C# de ejemplo? Estoy usando una clase BigInteger para representar los valores de p, q, n y e así que asumo que d también será BigInteger.Generar clave privada RSA en C#

Respuesta

1

La forma corta es para calcular la inversa de e modulo (p-1) * (q-1). En realidad, solo necesita el mínimo común múltiplo de p-1 y q-1, pero esto no le comprará mucho (sí, hay varios valores posibles para d, esto es normal, todos son equivalentes) .

Si su clase BigInteger tiene un método inverso modular, entonces esto será fácil: simplemente llámelo. De lo contrario, tendrá que calcularlo usted mismo, utilizando el algoritmo Euclidiano extendido (esto es lo que las clases BigInteger tienden a usar para calcular las inversas modulares).

3

De Wikipedia:

Determinar d (utilizando aritmética modular) que satisface la relación de congruencia alt text

  • Dicho de otra manera, ed - 1 puede ser dividido uniformemente por el totient (p - 1) (q - 1).
  • Esto a menudo se calcula utilizando el algoritmo Euclidiano extendido.
  • d se mantiene como el exponente de clave privada.

El algoritmo de Euclides extendido permite encontrar números enteros tales que se cumple lo siguiente:

alt text

El algoritmo de Euclides extendido es particularmente útil cuando a y b son primos entre sí , ya que x es la inversa multiplicativa modular de un módulo b.

En esta fórmula establecida a-e, b a (p-1)(q-1) y gcd(a, b) al 1 (ya que se requieren electrónico y φ (pq) coprimeros en el algoritmo RSA) y resolver para x que su d da. La página de Wikipedia en extended Euclidean algorithm tiene más detalles sobre cómo escribir el algoritmo para resolver x e y. Por ejemplo, puede utilizar esta función recursiva (en pseudo-código):

function extended_gcd(a, b) 
    if a mod b = 0 
     return {0, 1} 
    else 
     {x, y} := extended_gcd(b, a mod b) 
     return {y, x-(y*(a div b))} 

En .NET, si lo que desea es generar algunas claves RSA que no tiene que implementar el algoritmo RSA mismo. Ya existe una implementación de RSA en .NET Framework que puede usar.

+0

Sé cómo generar claves desde cero, pero por curiosidad estoy tratando de recuperar d de los valores anteriores. – b3n

1

Esta es la forma en que lo hice.

números primos p = 7 y q = 17

Calcular n = p * q = 119

Calcular f (n) = (p-1) * (q-1) = 96

Calcular d = e^-1 mod f (n), por ej., D = 77

Cuestiones relacionadas