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>
Bueno, empecemos con el código:
Generar un keypair (pareja de claves, pública y privada):
Código
//Especificamos la contrasena con la que se cifrara la clave privada var pass = "holasoyunacontrasena"; //Definimos el email del propietario de las claves var email = '<' + document.getElementById("mail").value + '>'; //El nombre de usuario var user = document.getElementById("user").value; //Se juntan nombre de usuario e email para formar el KeyID var id = user + ' ' + email; //Generamos las claves var clave = openpgp // Tamano KeyID Contrasena .generateKeyPair({numBits: 2048, userId: id, passphrase: pass}) .then(function(keyPair) { //Mostramos los resultados document.write('<pre>' + keyPair.privateKeyArmored + '</pre>'); document.write('<pre>' + keyPair.publicKeyArmored + '</pre>'); });
Cifrar:
Código
//Definimos la clave publica con la que cifrar var key = '-----BEGIN PGP PUBLIC KEY BLOCK----- . . .'; //Leemos dicha clave var publicKey = openpgp.key.readArmored(key); //Ciframos openpgp.encryptMessage ( publicKey.keys, //Clave publica "Message" //Mensaje a cifrar ) .then(function(pgpMessage){ //Mostramos el resultado document.write('<pre>' + pgpMessage + '</pre>'); })
Descifrar:
Código
//Definimos la clave privada para descifrar var key = '-----BEGIN PGP PRIVATE KEY BLOCK----- . . .'; //La leemos var privateKey = openpgp.key.readArmored(key).keys[0]; //La desciframos con la contrasena privateKey.decrypt("holasoyunacontrasena"); //Definimos el mensaje cifrado var pgpMessage = '-----BEGIN PGP MESSAGE----- . . .'; //Leemos el mensaje pgpMessage = openpgp.message.readArmored(pgpMessage); //Desciframos openpgp.decryptMessage ( privateKey, pgpMessage ) .then(function(plaintext){ //Mostramos el resultado document.write('<pre>' + plaintext + '</pre>'); })
Firmar:
Código
//Definimos clave privada var PVK = '-----BEGIN PGP PRIVATE KEY BLOCK----- . . .'; //La leemos var privKeys = openpgp.key.readArmored(PVK); var privKey = privKeys.keys[0]; //La desciframos privKey.decrypt("holasoyunacontrasena"); //Firmamos openpgp.signClearMessage ( privKeys.keys, //Clave privada "Message" //Mensaje ) .then(function(signed) { //Mostramos el mensaje firmado document.write('<pre>' + signed + '</pre>'); });
Verificar:
Código
//Indicamos la clave publica var PBK = '-----BEGIN PGP PUBLIC KEY BLOCK----- . . .'; //La leemos var publicKeys = openpgp.key.readArmored(PBK); //Definimos el mensaje firmado, con sus dos partes, el mensaje y la firma var tmp = '-----BEGIN PGP SIGNED MESSAGE----- . . .'; //Leemos el mensaje firmado var message = openpgp.cleartext.readArmored(tmp); //Verificamos openpgp.verifyClearSignedMessage ( publicKeys.keys, //Clave pública message //Mensaje firmado ) .then(function(verified) { if(verified.signatures[0].valid == true) { //Si la firma es valida document.write(verified.text); //Muestra el contenido del mensaje document.write('<pre>FIRMA VALIDA!</pre>'); } else { //Si NO es valida document.write('<pre>¡FIRMA NO VALIDA!</pre>'); } });
Firmar y cifrar (este particularmente me costó lograr que funcione):
Código
//Se define la clave publica (con la que se cifra) var PBK = '-----BEGIN PGP PUBLIC KEY BLOCK----- . . .'; //Se define la clave privada (con la que se firma) var PVK = '-----BEGIN PGP PRIVATE KEY BLOCK----- . . .'; //Leemos ambas claves var publicKey = openpgp.key.readArmored(PBK); var privateKey = openpgp.key.readArmored(PVK).keys[0]; //Desciframos con nuestra contrasena la clave privada privateKey.decrypt("holasoyunacontrasena"); //Firmamos y ciframos openpgp.signAndEncryptMessage ( publicKey.keys, //Clave publica privateKey, //Clave privada "Message" //Mensaje a procesar ) .then(function(pgpMessage) { //Mostramos el resultado document.write('<pre>\n' + pgpMessage + '</pre>'); })
Descifrar y verificar (este también fue un lío dominarlo):
Código
//Claves var PBK = '-----BEGIN PGP PUBLIC KEY BLOCK----- . . .'; var PVK = '-----BEGIN PGP PRIVATE KEY BLOCK----- . . .'; //Leemos var publicKeys = openpgp.key.readArmored(PBK); var privateKey = openpgp.key.readArmored(PVK).keys[0]; //Desciframos privateKey.decrypt("holasoyunacontrasena"); //Mensaje var pgpMessage = '-----BEGIN PGP MESSAGE----- . . .'; //Leemos mensaje message = openpgp.message.readArmored(pgpMessage); //Desciframos y verificamos openpgp.decryptAndVerifyMessage ( privateKey, //Clave privada publicKeys.keys, //Clave pública message //Mensaje firmado y cifrado ) .then(function(verified) { if(verified.signatures[0].valid == true) {//Si es valida la firma document.write(verified.text); //Esto muestra el contenido del mensaje document.write("VALIDA!"); //Indicamos su validez } else {//Si NO es valida document.write("NO VALIDA!"); //Indicamos su invalidez } });
Si alguno no funciona, avisadme, por favor...