Javascript SJCL加密结果文件大小错误

Javascript SJCL加密结果文件大小错误,javascript,encryption,filereader,rncryptor,sjcl,Javascript,Encryption,Filereader,Rncryptor,Sjcl,我已在我的一个应用程序中成功实施了iOS。我现在希望能够用我的JavaScript实现对该应用程序中的文件进行加密和解密。我使用FileReader从用户那里获取一个本地文件,并用 reader.readAsArrayBuffer(file); 完成此操作后,将使用对文件进行加密,最后可以下载加密文件: reader.onloadend = function(e) { var content = new Uint8Array(e.target.result); var utf

我已在我的一个应用程序中成功实施了iOS。我现在希望能够用我的JavaScript实现对该应用程序中的文件进行加密和解密。我使用FileReader从用户那里获取一个本地文件,并用

reader.readAsArrayBuffer(file);
完成此操作后,将使用对文件进行加密,最后可以下载加密文件:

reader.onloadend = function(e) {

    var content = new Uint8Array(e.target.result);
    var utf8 = "";
    for (var i = 0, len = content.length; i < len; i++) {
         utf8 += String.fromCharCode(content[i]);
    }
    var b64 = btoa(utf8);

    //we finally encrypt it 
    var encrypted = sjcl.encrypt(password, b64,{ks:256});
    var json = JSON.parse(encrypted);
    var ciphertext = json.ct;

    a.attr('href', 'data:application/octet-stream,' + ciphertext);
    a.attr('download', file.name + '.encrypted');

    step(4);

    };

reader.readAsArrayBuffer(file);
reader.onloadend=函数(e){
var内容=新的Uint8Array(即target.result);
var utf8=“”;
for(变量i=0,len=content.length;i
问题是加密文件比原始文件大得多。在我的iOS实现中,情况并非如此,它工作得很好。当然,它不能被无误地解密。事实上,结果文件的大小将为0字节

我希望有人能指出我代码中的错误。那太好了

@邓肯:

多谢各位。我对此进行了调查,但我并不确定我必须采取的所有步骤。尤其是它们在代码中的含义。也许有人能帮我。非常感谢

加密

  • 生成一个随机加密程序
  • 使用PBKDF2生成加密密钥(请参阅语言文档以了解如何调用该密钥)。将密码作为字符串、随机加密和10000次迭代传递
  • 生成随机的HMAC盐
  • 使用PBKDF2生成HMAC密钥(请参阅语言文档以了解如何调用该密钥)。将密码作为字符串、随机HMAC salt和10000次迭代传递
  • 生成一个随机的IV
  • 使用加密密钥(如上)、IV(如上)、AES-256和CBC模式加密数据。这是几乎所有AES加密库的默认模式
  • 将头和密文连同HMAC密钥(如上)和PRF“SHA-256”(PRF函数的名称请参阅您的库文档;这也可以称为“SHA-2,256位”)一起传递给HMAC函数
  • 按照上面给出的格式将这些元素放在一起
  • 使用加密密钥(如上)、IV(如上)、AES-256和CBC模式加密数据。这是几乎所有AES加密库的默认模式


    根据sjcl的说法,这是一个错误的假设,它使用ccm作为默认模式。

    RNCryptor使用a作为其输入和输出。在尝试与一些JavaScript代码集成时,您需要考虑到这一点。我已经开始研究RNCryptor格式的JavaScript实现(准备好后将显示)。JavaScript速度太慢,无法处理默认的RNCryptor设置。你必须减少PBKDF2的迭代次数,否则加密或解密数据需要几分钟的时间,甚至在桌面浏览器上也是如此(想到在移动设备上计算需要多少时间,我不寒而栗)。听到这个消息真是太好了。先谢谢你。那真是太酷了。我自己也在想这个。也许可以使用?@freshking,我不确定你的意思,你可以在cbc模式下使用sjcl,这不是默认模式。使用:sjcl.encrypt(密码,b64,{ks:256,mode:'ccm'}),但请注意配置中可能存在其他差异,因此请检查我提供的链接。我刚刚在SCJL中阅读了CBC模式,它似乎不起作用:你是对的,它完全不在sjcl中,我的错。也许你可以试试cryptojs,但我不熟悉。SJCL支持EBC模式吗?