2010-11-08 20 views
13

Busco dos funciones conceptualmente similares a estos:C/C++ cifrar/descifrar con la clave pública

// returns the encrypted text 
string encrypt(string public_key, string pass_phrase, string text); 
// returns the original text 
string decrypt(string private_key, string pass_phrase, string encrypted_text); 

donde string podría ser un char*, un std::string o algo fácilmente convertibles a los dos. Y donde public_key y private_key pueden ser básicamente cualquier cosa, desde las claves generadas con algunos comandos (cosas gpg/ssl o lo que sea) hasta las claves generadas con otras simples funciones.

He mirado en algunas bibliotecas de criptografía (libgcrypt, libgpgme, openssl ...), pero no se ve nada fácil de implementar dichas funciones con las bibliotecas: requieren un conocimiento no superficial sobre asimétrica cifrado y una gran cantidad de código.

De todos modos, esta tarea no parece poco común. ¿Cómo puedo implementar las dos funciones anteriores?

+2

¿Has comprobado Keyczar? http://code.google.com/p/keyczar/ –

+0

encrypted_text es probablemente datos binarios. Debe tener cuidado con los ceros incrustados. Incluiría longitudes en los prototipos ... – pmg

+0

@pmg: me doy cuenta de que hay una etiqueta [c], pero supongo que Peoro está pensando en C++ 'std :: string', que es de 8 bits limpia e incluye una longitud , separado del contenido de la cadena. –

Respuesta

6

Desafortunadamente, la encriptación siempre requiere un conocimiento no superficial de los algoritmos involucrados. Es difícil acertar. El "Manual de criptografía aplicada" es una guía relativamente legible de los diversos algoritmos disponibles, por lo que probablemente valga la pena echarle un vistazo.

También puedes probar cryptlib. Parece tener un diseño de capas adecuadas que le proporciona valores predeterminados razonables para muchos parámetros, por lo que puede comenzar sin preocuparse demasiado por los detalles.

+2

Bueno, no estoy de acuerdo tanto. Las dos funciones de las cuales di la firma (más otra para generar un par de claves público/privado) deberían ser suficientes para jugar con el cifrado. Por supuesto, no son muy personalizables, por lo que no serán lo suficientemente seguros como para ser utilizados con algo serio, pero creo que están bien para el 99% de los casos ... – peoro

+0

Voy a echar un vistazo a cryptlib, de todos modos , ¡Gracias por mencionarlo! – peoro

+2

Sugiero que también cambie sus firmas de funciones para trabajar en términos de bytes, no de cadenas. Crypto generalmente funciona en matrices de bytes opacos y la adición de semántica de cadenas hará que las cosas sean más difíciles. En esta capa, una clave es solo un conjunto de bytes, una frase de contraseña es un conjunto de bytes y el texto de borrado/cifrado son ambos conjuntos de bytes. * Pueden * representar cadenas con algún tipo de codificación de caracteres (ASCII, UTF-8 o lo que sea), pero a la capa de cifrado no le importa eso. –

0

Suponiendo que no necesita algo de plataforma independiente, Cryptography Next Generation (CNG) es una API de criptografía relativamente nueva en Windows y es sorprendentemente intuitiva y fácil de usar. Escribí un artículo que incluye ejemplos de todas las operaciones criptográficas principales que es probable que necesite en aplicaciones típicas. El código de ejemplo para el artículo también proporciona un ejemplo de trabajo completo para estas operaciones utilizando el compilador de Visual C++.

http://msdn.microsoft.com/en-us/magazine/cc163389.aspx

Para tratar las claves públicas y privadas como cadenas simplemente podría usar base 64 o una codificación similar.

+0

En realidad, estoy trabajando en Linux. ¡Gracias de cualquier manera! – peoro

5

Cuando alguien solicita una encriptación fácil, solo puedo recomendar KeyCzar.

No solo proporciona una interfaz limpia en varios idiomas (que puede usar las mismas teclas) sino también mecanismos para manejar rotaciones de tecla y similares.

Y por supuesto, valores predeterminados seguros para los algoritmos implementados para que no tenga que preocuparse por los detalles técnicos.

Realmente, el mejor fácil & combinación segura que he visto hasta ahora.

+0

no es keyczar solo un contenedor alrededor de openssl etc.? – BjornW

+1

@BjornWesen: sí, lo es. Desde el enlace * Keyczar está diseñado para ser abierto, extensible y compatible con varias plataformas. No pretende reemplazar las bibliotecas criptográficas existentes como OpenSSL, PyCrypto o Java JCE, y ** de hecho se basa en estas bibliotecas **. * (Énfasis mío) El único beneficio de KeyCzar es que elige los valores predeterminados seguros para usted para que no te dispares en el pie. –

+0

sí, y eso es, por supuesto, un objetivo muy apreciado :). Simplemente me encontré en la misma situación necesitando una biblioteca liviana haciendo una señal de clave pública/verificación, y la idea de tener que involucrar a openssl "solo" para hacer eso es pesado ... encontré libtom después, lo cual está bien para muchas cosas. – BjornW

Cuestiones relacionadas