2015-11-13 126 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

儘管如此,庫並沒有正確解密文本文件,但它在圖像上沒有正確執行 –