js解密GnuPG加密文件的内容

js解密GnuPG加密文件的内容

本文介绍了JavaScript:使用openpgp.js解密GnuPG加密文件的内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用在JavaScript中为GnuPG加密文件编写示例解密器。

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给出未知的ASCII装甲类型错误 message = openpgp.message.readArmored(message);

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?

推荐答案

OpenPGP知道消息的编码,

OpenPGP knows to encodings of messages,


  • 二进制消息,空间效率更高且

  • ASCII装甲消息以类似于base64的格式编码,通过不同的通道传输时作为纯文本提供更高的可靠性。

  • binary messages, which are more space-efficient and
  • ASCII-armored messages encoded in a format similar to base64, providing higher reliability when transmitted through different channels as being plain text.

openpgp.message.readArmored(message)只能理解ASCII装甲信息。请改用 openpgp.message.fromBinary(message)。作为替代方案,在加密时使用 - armor 选项通过GnuPG对消息进行编码,或者 gpg --enarmor 已加密的二进制消息。

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.

这篇关于JavaScript:使用openpgp.js解密GnuPG加密文件的内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-22 17:20