2008-09-23 11 views
6

Se me ha encomendado la tarea de implementar una biblioteca de PKI en C# para un proyecto de la compañía, y no he podido encontrar una buena implementación de la misma. Parece haber varias bibliotecas y muchos enlaces rotos que apuntan a las bibliotecas de MSDN que se han eliminado. He visto personas que usan Crypt32.dll, personas que crean sus propias bibliotecas, personas que usan P/Invoke para acceder a almacenes de certificados del sistema, personas que amplían las bibliotecas integradas, ejemplos que simplemente no se aplican a C# (por ejemplo, ejemplos de Java). y bibliotecas comerciales.Bibliotecas de cifrado?

Mi pregunta es, ¿qué implementación/biblioteca es la más recomendada para el cifrado/descifrado simple de datos?

Como contexto para lo que planeo hacer con él, simplemente necesito encriptar mensajes usando una clave privada (.pfx), y descifrar con claves públicas (.cer). No se requiere la firma y autenticación de mensajes en este nivel del proyecto, aunque puede ser en el futuro. He visto referencias a longitudes de cifrado que me inquietan. Necesitamos poder encriptar cualquier mensaje de longitud (¡dentro de lo razonable, por supuesto!). ¿Debo preocuparme por esto? De ser así, ¿hay alguna forma de enfrentarlo?

Preferiría no almacenar claves públicas/privadas en el administrador de certificados de Windows si es posible, pero si hace la implementación significativamente más simple, que así sea.

que dan cuenta de la PKI y encriptación es un tema muy amplio y complejo, pero estoy esperando para una biblioteca relativamente simple de todos modos ... (se puede esperar, ¿verdad?)

Gracias!

Respuesta

12

Bueno, usted no mencionó que la clase incorporada no cubre su necesidad, entonces ¿qué hay de System.Security.Cryptography.RSACryptoServiceProvider?

Tiene un conjunto grande de formas calificadas para encriptar/descifrar de forma asimétrica las secuencias.

Hay varias tutorial/guía que le llevará a lo largo del camino:

http://www.codeproject.com/KB/security/RSACryptoPad.aspx

http://www.eggheadcafe.com/articles/20020630.asp

hay un sinnúmero más para ser encontrado a través de Google.

Actualización: Acerca de los restricciones de longitud, no debería haber ningún problema si acaba de implementar el mismo algoritmo de búfer en ambos lados, cifrado y descifrado.

Update2: Sí, mi ejemplo era RSACryptoProvider, pero se puede utilizar cualquier clase que deriva de System.Security.Cryptography.AsymmetricAlgorithm, si desea una solución de clave pública/privada. O construya el suyo ... o tal vez no :)

+0

De hecho, la totalidad del espacio de nombres System.Security.Cryptography aplica. Debe contener todas las primitivas requeridas para la mayoría de los criptosistemas. –

+0

¿Podría aclarar sobre el algoritmo de búfer? Además, me pregunto si esto es estándar con el descifrado/cifrado de RSA. Parte de este cifrado se enviará a los clientes, y no puedo garantizar que usarán el mismo algoritmo de búfer al que decido ir. ¿Es probable que esto sea un problema o no? – Gabriel

0

Sí, ¿qué pasa con las clases incorporadas?

Y si no desea utilizar el almacén de certificados de Windows se puede usar algo como esto

RSACryptoServiceProvider rscp = new RSACryptoServiceProvider(); 
rscp.FromXmlString("<RSAKeyValue><Modulus>key data gere</Modulus><Exponent></Exponent></RSAKeyValue>"); 

No estoy seguro de que esta es una buena idea para las claves privadas, sin embargo.

Hay un buen tutorial sobre el tema here