这是使用openpgp.js加密二进制文件的一种可行方法,以及如何保存该文件以便也可以在Filebrowser中处理“手动”文件吗?

时间:2019-04-30 14:46:56

标签: node.js openpgp.js

我正在尝试读取二进制文件,以对其进行加密/解密和保存/写入。 将原始文件与解密的结果文件进行比较会导致相同的文件哈希。所以我认为这是一种正确/可行的方法。

如果我尝试在Windows中使用GnuPG手动解密文件,则表明已验证文件但未保存任何可用文件。所以我的问题是:我该如何存储也可以“手动”使用的文件。

使用的来源

我的代码基于以下帖子: https://commscentral.net/tech/?post=64

-> example code of post on GitHub

但是我读过有关处理二进制文件/有效载荷的内容:

openpgp.message.fromBinary()

应该被使用。 -> https://github.com/openpgpjs/openpgpjs/issues/204#issuecomment-43065260

我的代码

进口

const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
const writeFile = util.promisify(fs.writeFile);
const openpgp = require('openpgp') // use as CommonJS, AMD, ES6 module or via window.openpgp

加密

const encryptFuntion = async() => {
    openpgp.initWorker({ path:'openpgp.worker.js' }) // set the relative web worker path
    const pubkey = await readFile('pub.asc','utf8');
    const passphrase = `password`;
    const privkey = await readFile('priv.asc','utf8');
    const privKeyObj = (await openpgp.key.readArmored(privkey)).keys[0];
    await privKeyObj.decrypt(passphrase);
    const file = await readFile('test.txt');
    const fileArray = new Uint8Array(file);

    const options = {
        message: openpgp.message.fromBinary(fileArray),
        publicKeys: (await openpgp.key.readArmored(pubkey)).keys,
        privateKeys: [privKeyObj],
        armor:false
    };
    const encryptionResponse = await openpgp.encrypt(options);
    const encryptedFile = encryptionResponse.message.packets.write();
    await writeFile('test.txt.gpg',encryptedFile);
};

解密

const decryptFuntion = async () => {
    openpgp.initWorker({path: 'openpgp.worker.js'}) // set the relative web worker path
    const passphrase = `password`;
    const privkey = await readFile('priv.asc', 'utf8');
    const pubkey = await readFile('pub.asc', 'utf8');
    const privKeyObj = (await openpgp.key.readArmored(privkey)).keys[0];
    await privKeyObj.decrypt(passphrase);
    const file = await readFile('test.txt.gpg');
    const fileArray = new Uint8Array(file);
    options = {
        message: await openpgp.message.read(file), // parse encrypted bytes
        privateKeys: [privKeyObj],              // decrypt with password
        publicKeys: (await openpgp.key.readArmored(pubkey)).keys,
        format: 'binary'                          // output as Uint8Array
    };
    const decryptionResponse = await openpgp.decrypt(options);
    const decryptedFile = decryptionResponse.data;
    await writeFile('test-decrypted.txt', decryptedFile);
};

1 个答案:

答案 0 :(得分:0)

希望这会有所帮助,并根据我对NodeJS的了解对代码进行了一些更改。

{% else %}

我可能会在文件内容类型上出错,将使用fs.readFile

链接指的是: 1. Async waterfall 2. Openpgp 3. Node FS Module

PS:通过在stackoverflow上重新编写代码,这是我每周学习新知识的方式。