我无法解决加密文件的问题。
我从服务器收到一个文件并检查哈希
// get file
const xhr = new XMLHttpRequest();
xhr.open("GET", config.urlLogin + "files/" + e.id, true);
xhr.responseType = "arraybuffer";
xhr.send();
xhr.onreadystatechange = () => {
let iv;
let arrayBufferFile;
if (xhr.readyState != 4) return;
if (xhr.status != 200) {
console.log(xhr.status + ": " + xhr.statusText);
} else {
const file = new File([xhr.response], e.name);
this.checkHash(file, e => {
if (e) {
this.getIv(file);
}
});
}
};
检查哈希。哈希是正确的
checkHash(file, callback) {
const reader = new FileReader();
const data = this.state.fileChoose;
reader.onload = event => {
var binary = event.target.result;
const md = forge.md.sha256.create();
md.update(binary);
if (data.hash == window.btoa(md.digest().data)) {
callback(file);
} else {
callback(false);
}
};
reader.readAsBinaryString(file);
}
获取解密的iv。如果它是前16个字节。
getIv(file) {
const iv = file.slice(0, 16);
const fileForDec = file.slice(16);
const reader = new FileReader();
reader.onload = event => {
const iv = event.target.result;
this.decipherFile(fileForDec, iv);
};
reader.readAsBinaryString(iv);
}
并获取文件。 this.state.fileChoose - 来自服务器的这个数据。它有加密的关键。关键是正确的。
decipherFile(file, iv) {
const data = this.state.fileChoose;
const reader = new FileReader();
reader.onload = event => {
const fileBytes = event.target.result;
const cipher = forge.cipher.createDecipher("AES-CBC", window.atob(data.key));
cipher.start({ iv: iv });
cipher.update(forge.util.createBuffer(fileBytes));
cipher.finish();
let fileB = cipher.output;
const finishFile = new File([fileB.data], data.name);
var link = document.createElement("a");
link.download = data.name;
link.href = URL.createObjectURL(finishFile);
link.click();
};
reader.readAsBinaryString(file);
}
但文件不正确。 (
来自服务器的文件是'' .txt"文件有2个字节" ac",但文件在解密后有其他字节数)
PLS。帮助:)