2015-11-13 57 views
4

我正在尝试使用openpgp.js为JavaScript中的GnuPG加密文件编写示例解密器。JavaScript:使用openpgp.js解密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错误。

那么有可能吗?如果是这样,我应该做一些不同的事情吗?

+1

请更具体地在_where exactly_(哪条线)出现错误信息。猜测:您尝试加载用ASCII装甲编码的二进制信息。 –

+0

@JensErat对不起,当我试图打开一条消息(编辑问题)时,你能否详细说明你的猜测,我并不完全了解它 –

+1

OpenPGP标准中有两种“编码”,越多(空间)高效的二进制编码和ASCII铠装(类似于base64)。如果你的消息以'----- BEGIN PGP MESSAGE -----'开始,那么你使用的是ASCII装甲。我_guess_'readArmored'只会读取ASCII装甲消息。 –

回答

2

OpenPGP的知道到的消息的编码,

  • 二进制消息,它们以类似于BASE64的格式编码更节省空间和
  • ASCII装甲消息,提供更高的可靠性时作为纯文本通过不同的渠道传输。

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

+0

我改变了'message = openpgp.message.fromBinary(message)',那么消息不会解密'(参数“utf8”不是字符串类型)' –

+0

对不起,我不知道JavaScript足够理解处理二进制信息时可能会发生什么问题。我想你在使用网络技术时更安全地限制ASCII装甲的消息。 –

+0

尽管如此,库并没有正确解密文本文件,但它在图像上没有正确执行 –