SJCL加密导致文件大小错误



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

reader.readAsArrayBuffer(file);

完成后,文件将使用斯坦福JavaScript加密库进行加密,最后可以下载加密文件:

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);

问题是加密后的文件比原始文件大得多。在我的iOS实现中情况并非如此,它运行得很好。当然,它不可能在没有错误的情况下解密。事实上,生成的文件将具有0个字节的大小。

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

@邓肯:

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

加密

  1. 生成随机加密salt
  2. 使用PBKDF2生成加密密钥(请参阅您的语言文档了解如何调用该密钥)。将密码作为字符串、随机加密salt和10000次迭代传递
  3. 生成随机HMAC盐
  4. 使用PBKDF2生成HMAC密钥(请参阅您的语言文档了解如何调用它)。将密码作为字符串、随机HMAC salt和10000次迭代传递
  5. 生成随机IV
  6. 使用加密密钥(上图)、IV(上图),AES-256和CBC模式对数据进行加密。这是几乎所有AES加密库的默认模式
  7. 将您的标头和密文与HMAC密钥(如上)和PRF"SHA-256"一起传递给HMAC函数(有关PRF函数的名称,请参阅您库的文档;这也可能被称为"SHA-2256位")
  8. 按照上面给出的格式将这些元素组合在一起

使用加密密钥(上图)、IV(上图),AES-256和CBC模式对数据进行加密。这是几乎所有AES加密库的默认模式。

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

相关内容

  • 没有找到相关文章

最新更新