【发布时间】:2016-02-14 18:16:04
【问题描述】:
我正在尝试使用 openpgp.js 在 JavaScript 中为 GnuPG 加密文件编写示例解密器。
所以我天真地尝试了它,甚至没有问它是否可能。我做了以下页面。
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 在message = openpgp.message.readArmored (message); 上给出Unknown ASCII armor type 错误。
那么有可能吗?如果是,我应该做一些不同的事情吗?
【问题讨论】:
-
请更具体地说明错误消息出现的确切位置(哪一行)。猜测:您尝试加载使用 ASCII 铠装编码的二进制信息。
-
@JensErat 对不起,当我试图打开一条消息(编辑问题)时,你能详细说明你的猜测吗,我不太明白
-
OpenPGP 标准中有两种“编码”,一种(空间)效率更高的二进制编码和 ASCII 铠装(类似于 base64)。如果您的消息以
-----BEGIN PGP MESSAGE-----之类的开头,则您使用的是ASCII 装甲。我猜readArmored只会读取ASCII装甲消息。 -
是的,它是二进制编码的,你是对的。我试图将字节转换为消息(
message.fromBinary (bytes)),但消息没有被解密(Parameter "utf8" is not of type string) -
@JensErat 我可以将二进制编码转换为在 js 中装甲的 ascii 吗?
标签: javascript gnupg pgp openpgp.js