node-forge解密文件(AES-CBC)

时间:2018-01-28 13:28:30

标签: javascript file encryption

我无法解决加密文件的问题。

我从服务器收到一个文件并检查哈希

// 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。帮助:)

0 个答案:

没有答案