I'm trying to write a sample decryptor for GnuPG encrypted files in JavaScript using openpgp.js.
So I tried it naively without even asking if it is even possible. I made the following page.
popup.html
<!doctype html>
<!--
-->
<html>
<head>
<title>Popup</title>
<script src="openpgp.js"></script>
<script src="popup.js"></script>
</head>
<body>
<p>Upload message: </p><input id="message" type="file"/><br>
<p>Upload secret key: </p><input id="secret" type="file"/><br>
<p>Secret key password: </p><input id="password" type="password"/><br><br>
<button id="decrypt">Decrypt</button>
<p id="output"></p>
<div id="loadingDiv"></div>
</body>
</html>
popup.js
var message = "";
var secret = "";
function readMessage (e) {
var file = e.target.files[0];
if (!file) {
message = "";
}
var reader = new FileReader();
reader.onload = function (e) {
message = e.target.result;
};
reader.readAsText (file);
}
function readSecret (e) {
var file = e.target.files[0];
if (!file) {
secret = "";
}
var reader = new FileReader();
reader.onload = function (e) {
secret = e.target.result;
};
reader.readAsText (file);
}
function loadScript(url, callback)
{
var head = document.getElementsByTagName ("head")[0];
var script = document.createElement ("script");
script.type = "text/javascript";
script.src = url;
script.onreadystatechange = callback;
script.onload = callback;
head.appendChild(script);
}
document.addEventListener ("DOMContentLoaded", function() {
document.getElementById ("message").addEventListener("change", readMessage, false);
document.getElementById ("secret").addEventListener("change", readSecret, false);
var gen = function() {
document.getElementById ("decrypt").addEventListener ("click", function() {
var output = document.getElementById ("output");
output.style.color = "black";
if (document.getElementById ("message").value == "") {
output.innerHTML = "No message provided";
output.style.color = "red";
}
else if (document.getElementById ("secret").value == "") {
output.innerHTML = "No secret key provided";
output.style.color = "red";
}
else if (document.getElementById ("password").value == "") {
output.innerHTML = "No password for secret key provided";
output.style.color = "red";
}
else {
var privateKey = openpgp.key.readArmored (secret).keys[0];
var isCorrect = privateKey.decrypt (document.getElementById ("password").value);
if (isCorrect) {
output.innerHTML = "";
output.style.color = "black";
var img = document.createElement ("img");
img.src = "loading.gif";
img.id = "loading";
document.getElementById ("loadingDiv").appendChild (img);
message = openpgp.message.readArmored (message);
openpgp.decryptMessage (privateKey, message).then (function (plaintext) {
output.innerHTML = plaintext;
}).catch (function(error) {
output.innerHTML = "Error while decrypting";
output.style.color = "red";
});
}
else {
output.innerHTML = "Incorrect password";
output.style.color = "red";
}
}
});
}
loadScript ("openpgp.js", gen);
});
openpgp.js gives an Unknown ASCII armor type
error on message = openpgp.message.readArmored (message);
.
So is it possible? If it is, should I do something different?
To decrypt a message the option --decrypt is used. You need the private key to which the message was encrypted. Similar to the encryption process, the document to decrypt is input, and the decrypted result is output. blake% gpg --output doc --decrypt doc.
The GPG Project provides the tools and libraries to allows users to interface with a GUI or command line to integrate encryption with emails and operating systems like Linux. GPG can open and decrypt files encrypted by PGP or Open PGP, meaning it works well with other products.
OpenPGP knows to encodings of messages,
openpgp.message.readArmored (message)
only understands ASCII-armored information. use openpgp.message.fromBinary (message)
instead. As an alternative, encode the message through GnuPG using the --armor
option while encrypting, or gpg --enarmor
an already encrypted binary message.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With