使用SJCL解密encfs

时间:2014-07-03 10:14:35

标签: javascript xml encryption cryptography

我正在尝试几天做下面的事情:

我的硬盘/服务器文件是用ENCFS(aes256)加密的。我想要做的是使用JavaScript库在我的浏览器(客户端)解密它们。 现在,我找到了两个js库:

  • CryptoJS:我放弃了这个,因为解密真的很长;

  • SJCL:这个非常好,经过一些加密/解密工作,看起来这个比CryptoJS快100倍。

所以,好的。几天后我正在尝试使用SJCL ...我对使用库加密和解密文件有很好的结果,但我对使用encfs加密的文件进行解密时遇到了一些麻烦。

我正在按此顺序执行步骤:

  • 读取xml元信息文件并获取SJCL的信息。这是SJCL需求以及我在xml文件中选择的相应元素:
iv : chainedNameIV
v : 1 (default value)
iter : kdfIterations
ks : keySize
ts : blockSize
mode : 'ccm'
adata : '' (empty value...)
cipher : aes
salt : saltData
ct : ct is the content of the file i want to decrypt.

我认为我在为我的链设置的元素的“选择”中存在问题......这是我使用js代码进行的操作。

可以从xml文件获取信息并解密文件的函数文件。

var decrypt = {

    getMetaInfos: function(file) {
        var ks   = file.getElementsByTagName('keySize');
        var iv   = file.getElementsByTagName('chainedNameIV');
        var salt = file.getElementsByTagName('saltData');
        var iter = file.getElementsByTagName('kdfIterations');
        var ts   = file.getElementsByTagName('blockSize');

        var infos = {};

        infos.iv     = iv[0].childNodes[0].nodeValue;
        infos.v      = 1;
        infos.iter   = iter[0].childNodes[0].nodeValue;
        infos.ks     = ks[0].childNodes[0].nodeValue;
        infos.ts     = ts[0].childNodes[0].nodeValue;
        infos.mode   = 'ccm';
        infos.adata  = '';
        infos.cipher = 'aes';
        infos.salt   = salt[0].childNodes[0].nodeValue;
        infos.ct     = '';

        return infos;
    },

    getFileContent: function(file) {
        request = new XMLHttpRequest();

        request.open('POST', 'ajax.php', false);
        request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        request.send('t=getFile&file='+file);

        if (request.status >= 200 && request.status < 400){
            return request.responseText;
        }       
    },

    decryptFile: function(fileContent, metaInfos, passphrase) {
        metaInfos.ct = fileContent;
        console.log(metaInfos);
        console.log(sjcl.decrypt(passphrase, metaInfos));
    },

    createFile: function(file) {
        return;
    }

}

如果查看decryptFile函数,则有两个{​​{1}}。第一个是显示我的对象的所有元信息和我要解密的文件的内容,第二个是显示js错误的文件:

console.log

这是我的控制器文件:

Uncaught TypeError: undefined is not a function 

我正在使用AJAX和PHP脚本来获取文件的内容(window.onload = function() { // Declare some vars var xmlFile = 'files/coffre/ecfs6.xml'; var passPhrase = 'passphrase'; var request = new XMLHttpRequest(); // Ajax request request.onload = function() { xmlData = new DOMParser().parseFromString(request.responseText, 'text/xml'); // Get meta informations which'll help to decrypt files in folder (encfs config) xmlData = decrypt.getMetaInfos(xmlData); // Add eventlistener on link click to do all the stuff we need var links = document.getElementsByTagName('a'); for (var _i = 0; _i < links.length; _i++) { links[_i].onclick = function linkClicked() { var fileUrl = this.href; var fileContent = decrypt.getFileContent(fileUrl); var decryptedFile = decrypt.decryptFile(fileContent, xmlData, passPhrase); return false; }; } } // Sending request request.open('GET', xmlFile, false); request.send(); } ),然后我将数据编码为file_get_contents,然后将它们返回到我的js脚本。我存储的所有数据似乎都没问题。

要完成,这是我使用utf8_encode加密文件夹时生成的xml文件(在Ubuntu 14.04 VM上运行)。

encfs

接下来我的问题是:我是否收到商品xml字段?我错过了什么吗?我希望有一个人可以帮助我。不要害怕向我提出更多问题,我很乐意回答他们。

0 个答案:

没有答案