elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  [APORTE] Funciones principales OpenPGP.js
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [APORTE] Funciones principales OpenPGP.js  (Leído 1,734 veces)
arget

Desconectado Desconectado

Mensajes: 44


Ver Perfil
[APORTE] Funciones principales OpenPGP.js
« en: 31 Agosto 2015, 22:00 pm »

Esto empezó como una duda, pero mientras la explicaba pude resolver el problema, aunque, la verdad, me costó bastante, así que he decidido mostrar una explicación de las funciones de OpenPGP.js. Costó bastante resolver algunos problemas porque hay poca documentación, y la que hay es poco explicativa, y como imagino que habrá gente en mi misma situación, pues aquí pongo las soluciones a los problemas que me planteé; también, para presentar un manual medianamente completo, he estudiado algunas funciones que no necesitaba, o también añado mi implementación de algunas funciones que sí están bien documentadas [el caso de generateKeyPair(), de encryptMessage() y decryptMessage()].
Sinceramente no sé dónde colocar esto, he leído las normas del subforo y dice que solo dudas, no sé si valdrán aportes.

OpenPGP.js es una librería en javascript que implementa, si no todas, prácticamente todas las funciones del protocolo OpenPGP.
Su página de GitHub: http://www.github.com/openpgpjs/openpgpjs
El corazón de la librería está en /dist/ y se llama openpgp.js (no se va a llamar sardinasEnlatadas.js) .
Así que a partir de ahora lo incluimos siempre en la cabeza:
Código:
<script src="openpgp.js" type="text/javascript"></script>
Todas las funciones ya vienen en ese archivo, de manera que no hace falta almacenar el resto del proyecto.

Bueno, empecemos con el código:



Generar un keypair (pareja de claves, pública y privada):
Código
  1. //Especificamos la contrasena con la que se cifrara la clave privada
  2. var pass = "holasoyunacontrasena";
  3. //Definimos el email del propietario de las claves
  4. var email = '<' + document.getElementById("mail").value + '>';
  5. //El nombre de usuario
  6. var user = document.getElementById("user").value;
  7.  
  8. //Se juntan nombre de usuario e email para formar el KeyID
  9. var id = user + ' ' + email;
  10.  
  11. //Generamos las claves
  12. var clave = openpgp  //   Tamano    KeyID        Contrasena
  13. .generateKeyPair({numBits: 2048, userId: id, passphrase: pass})
  14. .then(function(keyPair)
  15. {   //Mostramos los resultados
  16.    document.write('<pre>' + keyPair.privateKeyArmored + '</pre>');
  17.    document.write('<pre>' + keyPair.publicKeyArmored + '</pre>');
  18. });
  19.  

Cifrar:
Código
  1. //Definimos la clave publica con la que cifrar
  2. var key = '-----BEGIN PGP PUBLIC KEY BLOCK----- . . .';
  3. //Leemos dicha clave
  4. var publicKey = openpgp.key.readArmored(key);
  5.  
  6. //Ciframos
  7. openpgp.encryptMessage
  8. (
  9.    publicKey.keys, //Clave publica
  10.    "Message"       //Mensaje a cifrar
  11. )
  12. .then(function(pgpMessage){
  13.    //Mostramos el resultado
  14.    document.write('<pre>' + pgpMessage + '</pre>');
  15. })
  16.  

Descifrar:
Código
  1. //Definimos la clave privada para descifrar
  2. var key = '-----BEGIN PGP PRIVATE KEY BLOCK----- . . .';
  3. //La leemos
  4. var privateKey = openpgp.key.readArmored(key).keys[0];
  5. //La desciframos con la contrasena
  6. privateKey.decrypt("holasoyunacontrasena");
  7.  
  8. //Definimos el mensaje cifrado
  9. var pgpMessage = '-----BEGIN PGP MESSAGE----- . . .';
  10. //Leemos el mensaje
  11. pgpMessage = openpgp.message.readArmored(pgpMessage);
  12.  
  13. //Desciframos
  14. openpgp.decryptMessage
  15. (
  16.    privateKey,
  17.    pgpMessage
  18. )
  19. .then(function(plaintext){
  20.     //Mostramos el resultado
  21.     document.write('<pre>' + plaintext + '</pre>');
  22. })
  23.  

Firmar:
Código
  1. //Definimos clave privada
  2. var PVK = '-----BEGIN PGP PRIVATE KEY BLOCK----- . . .';
  3. //La leemos
  4. var privKeys = openpgp.key.readArmored(PVK);
  5. var privKey = privKeys.keys[0];
  6. //La desciframos
  7. privKey.decrypt("holasoyunacontrasena");
  8. //Firmamos
  9. openpgp.signClearMessage
  10. (
  11.    privKeys.keys, //Clave privada
  12.    "Message"      //Mensaje
  13. )
  14. .then(function(signed)
  15. {
  16.    //Mostramos el mensaje firmado
  17.    document.write('<pre>' + signed + '</pre>');
  18. });
  19.  

Verificar:
Código
  1. //Indicamos la clave publica
  2. var PBK = '-----BEGIN PGP PUBLIC KEY BLOCK----- . . .';
  3. //La leemos
  4. var publicKeys = openpgp.key.readArmored(PBK);
  5. //Definimos el mensaje firmado, con sus dos partes, el mensaje y la firma
  6. var tmp = '-----BEGIN PGP SIGNED MESSAGE----- . . .';
  7. //Leemos el mensaje firmado
  8. var message = openpgp.cleartext.readArmored(tmp);
  9. //Verificamos
  10. openpgp.verifyClearSignedMessage
  11. (
  12.    publicKeys.keys, //Clave pública
  13.    message          //Mensaje firmado
  14. )
  15. .then(function(verified)
  16. {
  17.    if(verified.signatures[0].valid == true)
  18.    {   //Si la firma es valida
  19.        document.write(verified.text); //Muestra el contenido del mensaje
  20.        document.write('<pre>FIRMA VALIDA!</pre>');
  21.    }
  22.    else
  23.    {   //Si NO es valida
  24.        document.write('<pre>¡FIRMA NO VALIDA!</pre>');
  25.    }
  26. });
  27.  

Firmar y cifrar (este particularmente me costó lograr que funcione):
Código
  1. //Se define la clave publica (con la que se cifra)
  2. var PBK = '-----BEGIN PGP PUBLIC KEY BLOCK----- . . .';
  3. //Se define la clave privada (con la que se firma)
  4. var PVK = '-----BEGIN PGP PRIVATE KEY BLOCK----- . . .';
  5.  
  6. //Leemos ambas claves
  7. var publicKey = openpgp.key.readArmored(PBK);
  8. var privateKey = openpgp.key.readArmored(PVK).keys[0];
  9.  
  10. //Desciframos con nuestra contrasena la clave privada
  11. privateKey.decrypt("holasoyunacontrasena");
  12.  
  13. //Firmamos y ciframos
  14. openpgp.signAndEncryptMessage
  15. (
  16.    publicKey.keys, //Clave publica
  17.    privateKey,       //Clave privada
  18.    "Message"        //Mensaje a procesar
  19. )
  20. .then(function(pgpMessage)
  21. {   //Mostramos el resultado
  22.    document.write('<pre>\n' + pgpMessage + '</pre>');
  23. })
  24.  

Descifrar y verificar (este también fue un lío dominarlo):
Código
  1. //Claves
  2. var PBK = '-----BEGIN PGP PUBLIC KEY BLOCK----- . . .';
  3. var PVK = '-----BEGIN PGP PRIVATE KEY BLOCK----- . . .';
  4. //Leemos
  5. var publicKeys = openpgp.key.readArmored(PBK);
  6. var privateKey = openpgp.key.readArmored(PVK).keys[0];
  7. //Desciframos
  8. privateKey.decrypt("holasoyunacontrasena");
  9.  
  10. //Mensaje
  11. var pgpMessage = '-----BEGIN PGP MESSAGE----- . . .';
  12. //Leemos mensaje
  13. message = openpgp.message.readArmored(pgpMessage);
  14. //Desciframos y verificamos
  15. openpgp.decryptAndVerifyMessage
  16. (
  17.    privateKey, //Clave privada
  18.    publicKeys.keys, //Clave pública
  19.    message //Mensaje firmado y cifrado
  20. )
  21. .then(function(verified)
  22. {
  23.    if(verified.signatures[0].valid == true)
  24.    {//Si es valida la firma
  25.        document.write(verified.text); //Esto muestra el contenido del mensaje
  26.        document.write("VALIDA!"); //Indicamos su validez
  27.    }
  28.    else
  29.    {//Si NO es valida
  30.        document.write("NO VALIDA!"); //Indicamos su invalidez
  31.    }
  32. });
  33.  

Si alguno no funciona, avisadme, por favor...


En línea

La gestión manual de bloques de memoria en C es como hacer malabarismos con pastillas de jabón en la ducha de la prisión: todo diversión hasta que cometes un fallo.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines