Cifrado con llave publica y privada (RSA) en PHP
By: Date: febrero 3, 2015 Categories: Programación

En la misma platica donde se hablo del tema de la congeladora de empleados se hablo de criptografía y de la capacidad de PHP de hacerlo de forma nativa, esto debido a que los presentes no eran exactamente PHPeros .

PHP es muy capaz de manejar dentro del código sin tener que hacer llamadas al sistema y usar el comando OPENSSL para firmar certificados, en fin todas las tareas funcionales de encriptación. Que ahora son muy útiles si estas programando cosas como timbrado de facturas para el SAT

La mayoría de mis compilaciones de PHP no incluyen OpenSSL esto es porque no necesito manejar OpenSSL dentro de PHP cuando tengo una conexión segura por medio del servidor WEB, sin embargo si fuera necesario podría transmitir datos cifrados por medio de sockets en PHP a cualquier otra cosa, cosa que rara vez requiero porque no uso PHP para programación de conexiones en TCP/IP, pero si fuera necesario hacer esas conexiones en PHP es casi obligatorio hoy en el 2015 que todo lo que se transfiere por internet sea cifrado.

Recompile mi PHP para soportar OpenSSL y aquí pondré lo más básico, un sencillo sistema para cifrado de mensajes cortos que pueden ser leídos si se cuenta con las claves apropiadas.

Lo más básico del cifrado con 2 claves aka la privada y la pública.

El cifrado de 2 claves el cual es un cifrado prácticamente inviolable cuenta con 2 llaves que las genera la misma persona.

Genera una clave privada, esta clave debe conservarla celosamente y no compartirla con nadie, si alguien la supiera debería desecharla y crear un nuevo par de claves ( privada y publica )

También genera la segunda clave, la clave publica. Como su nombre lo dice la clave publica es “ PUBLICA “ y la puede compartir con el resto del mundo sin riesgo a su seguridad. La puedes enviar por email, whatsapp o cualquier medio inseguro, no hay ningún problema con que la gente obtenga la clave pública

¿ Como se usan estas 2 claves ?

Las claves se usan indistintamente para cifrar y descifrar bloques de información que pueden ser mensajes o bloques binarios , pero dependiendo con que clave cifres es el propósito del decifrado.

El uso de la clave publica

Cifrar y enviar un mensaje seguro que solo podrá ser leído por el destinatario y nadie más, por lo que no podrá ser descifrado jamás si no se tiene la clave privada. Esto garantiza que la información es totalmente confidencial.

El uso de la clave privada.

La clave privada también puede cifrar un mensaje que podría ser descifrado con la clave publica, ojo porque aquí el propósito cambia, ¿ que sentido tendría enviar un mensaje cifrado que puede ser descifrado con la clave que cualquiera puede obtener? Aquí la privacidad del mensaje no es tan importante como confirmar que el que envía el mensaje es la persona que dice ser.

Como solamente el dueño de la clave privada conoce la clave privada, solo el pudo haber cifrado ese mensaje el que recibe el mensaje no tiene duda que quien se lo manda es el dueño de la clave privada y es una prueba irrefutable de confiabilidad de que el mensaje proviene de quien dice ser.

Cifrado y re cifrado ( confiando en el remitente y el destinatario )

Por supuesto también hay trucos para hacer el mensaje confiable además de autentico, como re cifrar el mensaje con la clave publica del destinatario, el destinatario al descifrarlo con su clave privada obtendría el mensaje cifrado con la clave privada de remitente que finalmente podría descifrar con la clave publica del remitente que es quien le envía el mensaje haciendo que el mensaje no solo sea confirmado en su autenticidad sino en su seguridad. Esto último es más o menos como funciona un navegador web cuando muestra el candado, de forma que la información es completamente segura en ambas direcciones.

Limitaciones del cifrado

Debido a la naturaleza del cifrado no pueden ser cifrada cadenas largas de datos, entre 150 y 200 bytes por trozo. Si quieres cifrar mas que un pequeño mensaje o un archivo de megas bytes o giga bytes tendrás que ir dividendo en trozos de 150 bytes, del mismo modo al de cifrar tendrás que ir trozo por trozo y concatenando el archivo final para obtenerlo de regreso en su totalidad. Realmente no es complicado una sencilla función de cifrar y descifrar con ciclos while que sigan en TRUE mientras la cadena o el binario no lleguen a EOL o EOF según sea el caso y concatenando o haciendo chunks o trozos, posiblemente algunos lenguajes ya consideran esto dentro de su API, PHP maneja esto de forma nativa o RAW al menos en sus funciones y corre por tu cuenta hacer las funciones necesarias para el manejo de datos grandes.

Video demostrativo

Ejemplo de un programa PHP que cifra y de cifra una cadena de texto

<?php
// Create the keypair
$res=openssl_pkey_new();

// Get private key
openssl_pkey_export($res, $privatekey);

// Get public key
$publickey=openssl_pkey_get_details($res);
$publickey=$publickey["key"];

echo "Private Key:<BR>$privatekey<br><br>Public
Key:<BR>$publickey<BR><BR>";

$cleartext = '1234 5678 9012 3456';

echo "Clear text:<br>$cleartext<BR><BR>";

openssl_public_encrypt($cleartext, $crypttext, $publickey);

echo "Crypt text:<br>$crypttext<BR><BR>";

openssl_private_decrypt($crypttext, $decrypted, $privatekey);

echo "Decrypted text:<BR>$decrypted<br><br>";
?>

8 thoughts on “Cifrado con llave publica y privada (RSA) en PHP

  1. Google Chrome 40.0.2214.111 Windows NT

    Se ve genial, y aqui vengo con una pregunta, ejemplo:
    Tengo un sistema de usuarios validado por cookies & Sesiones encriptadas en md5 y despues sha1 en php para que no puedan ingresar facilmente a al panel, depsues genero otra cookie si el administrador quiere acceder, pero ingresa su contraseña, ahí va mi pregunta, puedo autenticar un usuario con openssl en esté caso generando un certificado .crt o algo así? osea como una contraseña pero en lugar de contraseña sube un certificado ? es posible eso?

  2. Mozilla Firefox 35.0 Windows NT

    Pues no vaido por sesiones si no por cookies, imagina, una cookie almacena el id de usuario la otra una cadena encriptada en md5 y sha1, que contiene un pin de 4 digitos que el usuario ha guardado anteriormente, si el hacker intenta acceder a la cookie mete una cadena cifrada incorrecta pues lograra acceder al inicio pero en cada pagina se consulta que la cadena encriptada con md5 y sha1 sea la misma de la base de datos, y si le agrego el .crt sería un poco más seguro.. no?

  3. Mozilla Firefox 40.0 Mac OS X 10

    A que te refieres con “Lo más básico del cifrado con 2 claves aka la privada y la pública.”
    sobretodo con “lo mas básico” ..

  4. Mozilla Firefox 82.0 Ubuntu Linux

    Hola, muy interesante y muy buen artículo.
    Te hago una consulta, suponiendo que tenemos un aplicación que por medio de un password se guarda información cifrada con este método, si en algún momento ese password (clave privada) cambia, entonces el texto que hemos guardado con la clave anterior ya no sería recuperable no?.
    Desde ya muchas gracias.

Responder a Edgar Alan Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *