我已经在我的一个应用程序中成功实现了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个字节的大小。
我希望有人能向我指出我代码中的错误。那真的太好了。
@邓肯:
谢谢。我对此进行了调查,但我真的不确定我必须采取的所有步骤。尤其是它们在代码中的含义。也许有人能帮我。非常感谢!
加密
- 生成随机加密salt
- 使用PBKDF2生成加密密钥(请参阅您的语言文档了解如何调用该密钥)。将密码作为字符串、随机加密salt和10000次迭代传递
- 生成随机HMAC盐
- 使用PBKDF2生成HMAC密钥(请参阅您的语言文档了解如何调用它)。将密码作为字符串、随机HMAC salt和10000次迭代传递
- 生成随机IV
- 使用加密密钥(上图)、IV(上图),AES-256和CBC模式对数据进行加密。这是几乎所有AES加密库的默认模式
- 将您的标头和密文与HMAC密钥(如上)和PRF"SHA-256"一起传递给HMAC函数(有关PRF函数的名称,请参阅您库的文档;这也可能被称为"SHA-2256位")
- 按照上面给出的格式将这些元素组合在一起
使用加密密钥(上图)、IV(上图),AES-256和CBC模式对数据进行加密。这是几乎所有AES加密库的默认模式。
这是一个错误的假设,根据这个sjcl使用ccm作为默认模式。