{"id":1263,"date":"2015-02-03T00:38:45","date_gmt":"2015-02-03T06:38:45","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=1263"},"modified":"2015-02-03T01:03:47","modified_gmt":"2015-02-03T07:03:47","slug":"1263","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=1263","title":{"rendered":"Cifrado con llave publica y privada (RSA) en PHP"},"content":{"rendered":"<p>En la misma platica donde se hablo del tema de <a href=\"https:\/\/www.lastdragon.net\/?p=1261\">la congeladora de empleados<\/a> se hablo de criptograf\u00eda y de la capacidad de PHP de hacerlo de forma nativa, esto debido a que los presentes no  eran exactamente PHPeros .<\/p>\n<p>PHP es muy capaz de manejar dentro del c\u00f3digo sin tener que hacer llamadas al sistema y usar el comando OPENSSL para firmar certificados, en fin todas las tareas funcionales de encriptaci\u00f3n. Que ahora son muy \u00fatiles si estas programando cosas como timbrado de facturas para el SAT<\/p>\n<p>La mayor\u00eda de mis compilaciones de PHP no incluyen OpenSSL esto es porque no necesito manejar OpenSSL dentro de PHP cuando tengo una conexi\u00f3n segura por medio del servidor WEB, sin embargo si fuera necesario podr\u00eda transmitir datos cifrados por medio de sockets en PHP a cualquier otra cosa, cosa que rara vez requiero porque no uso PHP para programaci\u00f3n 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.<\/p>\n<p>Recompile mi PHP para soportar OpenSSL y aqu\u00ed pondr\u00e9 lo m\u00e1s b\u00e1sico, un sencillo sistema para cifrado de mensajes cortos que pueden ser le\u00eddos si se cuenta con las claves apropiadas.<\/p>\n<p><strong>Lo m\u00e1s b\u00e1sico del cifrado con 2 claves aka la privada y la p\u00fablica.<\/strong><\/p>\n<p>El cifrado de 2 claves el cual es un cifrado pr\u00e1cticamente inviolable cuenta con 2 llaves que las genera la misma persona.<\/p>\n<p>Genera una clave privada, esta clave debe conservarla celosamente y no compartirla con nadie, si alguien la supiera deber\u00eda desecharla y crear un nuevo par de claves ( privada y publica )<\/p>\n<p>Tambi\u00e9n genera la segunda clave, la clave publica. Como su nombre lo dice la clave publica es \u201c PUBLICA \u201c 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\u00fan problema con que la gente obtenga la clave p\u00fablica<\/p>\n<p><strong>\u00bf Como se usan estas 2 claves ?<\/strong><\/p>\n<p>Las claves se usan indistintamente para cifrar y descifrar bloques de informaci\u00f3n que pueden ser mensajes o bloques binarios , pero dependiendo con que clave cifres es el prop\u00f3sito del decifrado.<\/p>\n<p><strong>El uso de la clave publica<\/strong><\/p>\n<p>Cifrar y enviar un mensaje seguro que solo podr\u00e1 ser le\u00eddo por el destinatario y nadie m\u00e1s, por lo que no podr\u00e1 ser descifrado jam\u00e1s si no se tiene la clave privada. Esto garantiza que la informaci\u00f3n es totalmente confidencial.<\/p>\n<p><strong>El uso de la clave privada.<\/strong><\/p>\n<p>La clave privada tambi\u00e9n puede cifrar un mensaje que podr\u00eda ser descifrado con la clave publica, ojo porque aqu\u00ed el prop\u00f3sito cambia, \u00bf que sentido tendr\u00eda enviar un mensaje cifrado que puede ser descifrado con la clave que cualquiera puede obtener? Aqu\u00ed la privacidad del mensaje no es tan importante como confirmar que el que env\u00eda el mensaje es la persona que dice ser.<\/p>\n<p>Como solamente el due\u00f1o 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\u00f1o de la clave privada y es una prueba irrefutable de confiabilidad de que el mensaje proviene de quien dice ser.<\/p>\n<p><strong>Cifrado y re cifrado ( confiando en el remitente y el destinatario )<\/strong><\/p>\n<p>Por supuesto tambi\u00e9n hay trucos para hacer el mensaje confiable adem\u00e1s de autentico, como re cifrar el mensaje con la clave publica del destinatario, el destinatario al descifrarlo con su clave privada obtendr\u00eda el mensaje cifrado con la clave privada de remitente que finalmente podr\u00eda descifrar con la clave publica del remitente que es quien le env\u00eda el mensaje haciendo que el mensaje no solo sea confirmado en su autenticidad sino en su seguridad. Esto \u00faltimo es m\u00e1s o menos como funciona un navegador web cuando muestra el candado, de forma que la informaci\u00f3n es completamente segura en ambas direcciones.<\/p>\n<p><strong>Limitaciones del cifrado<\/strong><\/p>\n<p>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\u00f1o mensaje o un archivo de megas bytes o giga bytes tendr\u00e1s que ir dividendo en trozos de 150 bytes, del mismo modo al de cifrar tendr\u00e1s que ir  trozo por trozo y concatenando el archivo final para obtenerlo de regreso en su totalidad. Realmente no es complicado una sencilla funci\u00f3n de cifrar y descifrar con ciclos while que sigan en TRUE mientras la cadena o el binario no lleguen a EOL o EOF seg\u00fan 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.<\/p>\n<p>Video demostrativo<\/p>\n<p><iframe loading=\"lazy\" width=\"420\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/MHtBDHnFdJM\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>Ejemplo de un programa PHP que cifra y de cifra una cadena de texto<\/p>\n<p><code>&lt;?php<br \/>\n\/\/ Create the keypair<br \/>\n$res=openssl_pkey_new();<\/p>\n<p>\/\/ Get private key<br \/>\nopenssl_pkey_export($res, $privatekey);<\/p>\n<p>\/\/ Get public key<br \/>\n$publickey=openssl_pkey_get_details($res);<br \/>\n$publickey=$publickey[\"key\"];<\/p>\n<p>echo \"Private Key:&lt;BR&gt;$privatekey&lt;br&gt;&lt;br&gt;Public<br \/>\nKey:&lt;BR&gt;$publickey&lt;BR&gt;&lt;BR&gt;\";<\/p>\n<p>$cleartext = '1234 5678 9012 3456';<\/p>\n<p>echo \"Clear text:&lt;br&gt;$cleartext&lt;BR&gt;&lt;BR&gt;\";<\/p>\n<p>openssl_public_encrypt($cleartext, $crypttext, $publickey);<\/p>\n<p>echo \"Crypt text:&lt;br&gt;$crypttext&lt;BR&gt;&lt;BR&gt;\";<\/p>\n<p>openssl_private_decrypt($crypttext, $decrypted, $privatekey);<\/p>\n<p>echo \"Decrypted text:&lt;BR&gt;$decrypted&lt;br&gt;&lt;br&gt;\";<br \/>\n?&gt;<\/p>\n<p><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la misma platica donde se hablo del tema de la congeladora de empleados se hablo de criptograf\u00eda 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\u00f3digo sin tener que hacer llamadas al&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1263","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1263"}],"version-history":[{"count":5,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1263\/revisions"}],"predecessor-version":[{"id":1268,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1263\/revisions\/1268"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}