Pregunta

Estoy tratando de encontrar una manera de leer una clave privada creada con OpenSSL PKCS#8 RSA en C# sin usar una biblioteca externa.

¿Alguien sabe cómo puedo hacer esto?

¿Fue útil?

Solución

La forma más sencilla de hacerlo por una biblioteca externa, es el uso de la (gratis) Chillkat público / privado componente clave : el uso que, importar la clave se puede hacer usando sólo unas pocas líneas de código y si está dispuesto a pagar los $ 149, o lo que para el resto de la biblioteca, que hará que se trata de conceptos generales de cifrado mucho más fácil así.

Y a diferencia del proyecto Mono regular de Microsoft .NET Framework, ¿Tiene parecen tener un aplicación PKCS8 para el que el completa fuente C # está disponible. Esto puede ser adecuado como punto de partida en caso de que absolutamente no puede confiar en bibliotecas externas, asumiendo la licencia (LGPL 2.0) asociado con el código Mono funciona para usted ...

Finalmente, el formato PKCS # 8 no es demasiado difícil de analizar, y los RSA / DSA par clave objetos son como por PKCS # 11 y relativamente fácil de convertir a un .NET X509Certificate una vez que averiguar donde todos los bits van - en realidad hice esto en VB.NET hace un tiempo, pero por desgracia no soy capaz de compartir ese código.

Otros consejos

Gracias por tu respuesta.

Mi script para crear la clave RSA utilicé OpenSSL con:

(Secuencia de comandos de Linux)

openssl genrsa -out ${NAME}_openssl.key 2048
openssl pkcs8 -topk8 -in ${NAME}_openssl.key -nocrypt > ${NAME}.key
openssl req -new -x509 -key ${NAME}.key -out ${NAME}.crt -outform DER

En C# necesitamos una clave privada en formato XML.solía este analizador para hacer esto.

Para descifrar el desafío necesitamos usar:

  byte[] challange = server.getChallenge();

  RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();

  rsaProvider.FromXmlString(Demo.Properties.Resources.XmlPrivateKey);

  byte[] plaintext = rsaProvider.Decrypt(challange, false);

Para cifrar con el certificado del servidor necesitamos usar:

  RSACryptoServiceProvider rsaProvider = x509.PublicKey.Key as RSACryptoServiceProvider;

  byte[] answer = RsaProvider.Encrypt(plaintext, false);

Gracias por la consultoría JavaScience

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top