Saltar al contenido

¿Cifrar archivos usando PGP en PHP?

Haz todo lo posible por interpretar el código bien antes de aplicarlo a tu trabajo si tdeseas aportar algo puedes comentarlo.

Solución:

Pregunta 1: Acerca de PGP

  • PGP (Pretty Good Privacy) es un producto y una marca registrada de Symantec Corporation (lo compraron hace algunos años).
  • OpenPGP es el estándar utilizado por PGP.
  • GnuPG (Gnu Privacy Guard) es una implementación gratuita y de código abierto de PGP.

Así que lo que quieres hacer es cifrar a un OpenPGP key. La implementación de OpenPGP que usa su cliente para descifrar los datos no es importante para usted. Con PHP, comúnmente se usa GnuPG y hay interfaces integradas.

Pregunta 2: Usando GnuPG en PHP

Utilice la interfaz GnuPG, que es una extensión que se puede instalar para PHP.

En primer lugar, importe el keydonde $keydata es el público blindado ASCII key:

 import($keydata);
print_r($info);
?>

Entonces usa esto key para encriptar los datos, esta vez usando el cliente keyhuella dactilar de:

 addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
  $enc = $gpg -> encrypt("just a test");
  echo $enc;
?>

Si desea cifrar archivos, léalos y páselos a encrypt(). Asegúrese de usar al menos largo key identificaciones (ej. DEADBEEFDEADBEEF), mejores huellas dactilares (como en el ejemplo) al hacer referencia keys; y nunca use corto key identificaciones (DEADBEEF), ya que son vulnerables a los ataques de colisión.


Este es un ejemplo más completo para hacer ambas cosas agregado por un usuario en el manual de PHP.

Voy a dejar una respuesta aquí, ya que muchos ejemplos en la red para PHP GnuPG son muy básicos y, con suerte, esto le ahorrará a alguien algo de frustración.

Básicamente, refleja cómo funciona la herramienta de línea de comandos GnuPG. Necesitas importar un key si no está ya en gpg’s key anillo, debe seleccionar el destinatario key utilizar para el cifrado/descifrado.

gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt

Si hiciste lo que hice y aprobaste en el key como destinatario no funciona!

No está claro qué es este campo ni en el manual de GPG ni en la documentación de PHP que se refiere a este campo como “huella digital”. Verifique los gpg key anillo para tu recien importado key con:

gpg --list-keys

Esto generará algo como esto:

pub   rsa2048 2019-04-14 [SC] [expires: 2021-04-14]
      0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA
uid           [ultimate] Dean Or
sub   rsa2048 2019-04-14 [E] [expires: 2021-04-14]

Esto le dará el UID y en la segunda línea la huella digital asociada con cada key. Por lo que puedo decir, puede usar el UID y la huella digital como destinatario.

Entonces, su código PHP para encriptar podría verse así:

// Encrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// Check key ring for recipient public key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) 
    $gpg->import('recipients-public-key.asc');

$gpg->addencryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
echo $gpg->encrypt('This is a test!');

Entonces el código del destinatario se verá así:

// Decrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// Check key ring for recipient private key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) 
    $gpg->import('recipients-private-key.asc');

$gpg->adddecryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA', '');
echo $gpg->decrypt($encyptedMessage);

Tenga en cuenta que las huellas dactilares son las mismas tanto para el público como para el privado del destinatario. key.

¡También hay un problema conocido con adddecryptkey que no toma una frase de contraseña! Debe eliminar la frase de contraseña o cambiar su versión de GnuPG.

Puntuaciones y reseñas

Tienes la opción de añadir valor a nuestro contenido tributando tu experiencia en las explicaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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