从流 Openpgp.js 加载消息时格式错误的装甲文本

Misformed armored text when loading Message from Stream Openpgp.js

我有一个作业在后台处理解密作业的执行。 这是解密代码:

export default async function (
  job: Job<DecryptionJobPayload>,
  cb: DoneCallback,
) {
  console.log(
    `[${process.pid}] Attempting Decryption delegated to job with UUID:  ${job.id}`,
  );
  const {privateKey, sourcePath, outputPath} = job.data;
  const pKey = await opengpg.readPrivateKey({armoredKey: privateKey});
  const sourceStream = createReadStream(sourcePath);
  opengpg
    .readMessage({
      armoredMessage: sourceStream,
    })
    .then((M) => {
      opengpg
        .decrypt({
          message: M,
          decryptionKeys: pKey,
        })
        .then((e) => {
          e.data
            .pipe(createWriteStream(outputPath))
            .on('end', cb(null, 'SUCCESS'))
            .on('error', cb(new Error('Error Occured'), 'FAILED'));
        })
        .catch((err) => cb(err, 'FAILED'));
    })
    .catch((err) => {
      cb(err, 'FAILED READING THE MESSAGE FROM STREAM');
    });

异常发生在这个catch块:

    .catch((err) => {
      cb(err, 'FAILED READING THE MESSAGE FROM STREAM');
    });

有以下例外情况:

Misformed armored text
at /usr/src/app/node_modules/openpgp/src/encoding/armor.js:250:25
at processTicksAndRejections (internal/process/task_queues.js:93:5)

在检查 openpgp.js 代码以查看导致 unarmor 函数中此类异常提升的原因之后。我找到了这 3 个案例:

  1. 它读取了一个未定义的行:
if (line === undefined) {
   throw new Error('Misformed armored text');
              } 
  1. 如果编写器在实际关闭之前完成:
   const { done, value } = await reader.read();
   if (done) {
     throw new Error('Misformed armored text');}
  1. 我不太确定...但如果有人可以提供帮助,请提供代码!
const { done, value } = await reader.read();
const reSplit = /^-----[^-]+-----$/m;
const line = value + '';
 if (line.indexOf('=') === -1 && line.indexOf('-') === -1) {
   await writer.write(line);
 } else {
   let remainder = await reader.readToEnd();
   if (!remainder.length) remainder = '';
   remainder = line + remainder;
   remainder = util.removeTrailingSpaces(remainder.replace(/\r/g, ''));
   const parts = remainder.split(reSplit);
   if (parts.length === 1) {
     throw new Error('Misformed armored text');
   }

起初我以为问题可能出在文件格式上,但该文件是在之前的工作中由同一个包生成的...

更新 1 我在我的文件中测试了第三个可能的原因以弄清楚它的作用。 当我们到达消息中有“=”或“-”的部分时,最后一段代码开始执行,例如在我使用的这个测试文件中:

-----BEGIN PGP MESSAGE-----

wV4D657zkXTrd+wSAQdA2p3p2iMnFX7oHSPSFSJP20J4ibR3ilwz1T6XO7jo
.....
.....
zef62S0eNiLhU1KTThfYNKLuiG8y4N90MSlH92ruYC8RFiMvuaDud52sl4jX
D/IuUi0yPSdwbuc=
=j9F8
-----END PGP MESSAGE-----

当 Reader 到达最后 3 行时,它读取直到末尾清除空格并由正则表达式拆分以找到部分 =["D/IuUi0yPSdwbuc==j9F8",""]。并且检查通过 (parts.length!==1)。 所以我认为可以肯定地说这不是问题的原因!

我找到了解决方案。感谢 openpgp.js 团队的 Daniel Huigens! 文档中未指定,但解决此问题的方法是读取 utf8 编码的数据,而不是二进制数据。所以解决方案是:

const sourceStream = createReadStream(sourcePath,'utf8')