este problema se puede resolver de variadas formas, pero en este caso te compartimos la solución más completa en nuestra opinión.
Solución:
En público/privado asimétrico key encription por lo general:
- Bob generó su publico privado key par
- Bob compartió su público key
- Alice encripta algún mensaje con el público key de Bob
- ella manda el mensaje
- Solo Bob puede descifrar con su privado key.
Ahora podemos usar el abressl biblioteca para aprender criptografía básica. Tenga en cuenta que el siguiente código no es adecuado para el software de producción, úselo solo para aprender los conceptos básicos del cifrado asimétrico.
Usando ese enfoque y el siguiente código, Alice puede enviar con éxito un mensaje a Bob
/** BOB CODE **/
$key = openssl_pkey_new(array('private_key_bits' => 2048));
$bob_key = openssl_pkey_get_details($key);
$bob_public_key = $bob_key['key'];
Esa es la infraestructura básica que tenía en su código y ahora es el código que ejecuta Bob. Bob genera el key par y envía a Alice, en un entorno real debe haber un público key mecanismo de compartir.
Cuando Alice consigue el público de Bob keyella cifra su mensaje con esto key:
/** ALICE CODE **/
$alice_msg = "Hi Bob, im sending you a private message";
openssl_public_encrypt($alice_msg, $pvt_msg, $bob_public_key);
Finalmente Bob recibe el mensaje y lo descifra
/** BOB CODE **/
openssl_private_decrypt( $pvt_msg, $bob_received_msg, $key);
print $bob_received_msg;
Biblioteca de cifrado recomendada para producción
Use libsodium si busca un sistema de producción seguro. Con él puedes encriptar mensajes…
// Generating your encryption key
$key = Sodiumrandombytes_buf(SodiumCRYPTO_SECRETBOX_KEYBYTES);
// Using your key to encrypt information
$nonce = Sodiumrandombytes_buf(SodiumCRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = Sodiumcrypto_secretbox('test', $nonce, $key);
… y descifrar mensajes…
$plaintext = Sodiumcrypto_secretbox_open($ciphertext, $nonce, $key);
if ($plaintext === false)
throw new Exception("Bad ciphertext");
…entre otras cosas.
¿Qué es un nonce?
Consulte el manual completo para usarlo con PHP
Léalo detenidamente, el cifrado no es algo que uno pueda aprender en una semana. Hay algunas advertencias.
Toda la idea de público-key criptografía es que cada ‘usuario’ tiene un ‘Público key’ y un ‘Privado key’. Hay 3 implementaciones principales para estos keys: confidencial, autenticado y combinado. En mi respuesta, usaré la técnica ‘confidencial’.
Cada usuario tiene un ‘Público key’ que distribuyen y que será utilizado por el otro usuario para encriptar el mensaje que se le devolverá, y un ‘Privado key’ que guardan solo para ellos y que se utiliza para descifrar los mensajes que recibirán. Él key que has usado para encriptar tu mensaje, no es lo mismo key que se utiliza para descifrar.
Ejemplo de ‘confidencial key usar’:
bob tiene: Bob privado keybob público key, alicia publico key
Alicia tiene: Alice privado keyalicia pública key, Bob publico key
Beto quiere enviar un mensaje para Alicia:
bob usa ‘Alicia público key’ para cifrar el mensaje, lo envía =>
Alicia usa ‘Alicia privado key’ para descifrar el mensaje.
Alicia quiere responder y envía un mensaje a Bob:
Alicia usa ‘Bob público key’ para cifrar el mensaje, lo envía =>
bob usa ‘Bob privado key’ para descifrar el mensaje.
Público key solo se usa para cifrar el mensaje
Privado key solo se usa para descifrar mensajes cifrados con Public key
Ahora que sabes cuál es la idea básica del ‘Público key’ y ‘Privado key’ es, echa un vistazo a esta imagen que explica la típica comunicación SSL y el uso de la keys.
Firmas, una especie de hash que acredita al titular de la propiedad privada key creó el mensaje cifrado. Es bueno que Alice demuestre que Bob le escribió un mensaje (encriptado con el código público de Alice). key) – en lugar de Joe. Bob crea una firma única usando su privado keyque Alice puede confirmar usando el público de Bob.
🙂