Cifrado con llave publica y privada (RSA) en PHP

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>";
?>

7 Comments

Add a Comment

Comment spam protected by SpamBam