我需要从本地文件系统加载文件,加密并使用chrome将其保存回本地文件系统。我用--allow-file-access-from-files
标志启动chrome。
这是用于加载文件,将其转换为字节数组并加密字节数组的代码:
var http = new XMLHttpRequest();
http.responseType = "arraybuffer";
http.open("GET","file.bin",false);
http.send();
var plain = Array.apply([], new Int8Array(http.response));
var encryptedByteArray = encryptFunction(plain);
此时加密数组包含预期的字节,因为我将它与用Java编写的脚本的工作版本进行了比较。 在Java应用程序中,字节数组随后通过以下内容保存到磁盘:
new BufferedOutputStream(new FileOutputStream("encryptedFromJava")).write(encryptedByteArray)
问题是在javascript中将加密的字节数组写入磁盘。我试过了:
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
fs.root.getFile('encryptedFromJavascript.bin', {create: true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
var blob = new Blob(encryptedByteArray);
fileWriter.addEventListener("writeend", function() {
location.href = fileEntry.toURL();
}, false);
fileWriter.write(blob);
}, function() {});
}, function() {});
}, function() {});
但如果我在diff
和encryptedFromJava.bin
上执行encryptedFromJavascript.bin
,则会有所不同。
encryptedByteArray
具有正确的字节,我无法弄清楚如何保存它,以便与通过Java创建的加密文件没有区别。
如果我尝试使用简单数组进行编写(例如,将encryptedByteArray替换为包含{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }
的字节数组),则Java代码创建的文件包含^A^B^C^D^E^F^G^H
,而javascript创建的文件包含12345678
{1}}。
在java中创建的文件也是application/octet-stream
,在javascript中创建的文件是plain/text
。使用Blob
初始化{type: 'application/octet-stream'}
对象似乎没有任何区别。
我很欣赏这很可能不是实现任务的最佳方式,但我想了解是否有可能以与Java相同的格式编写文件。