使用OpenPGP.js解密非装甲PGP文件

thr*_*ars 8 encryption openpgp public-key-encryption node.js openpgp.js

我正在开发一个Node应用程序,我已经在其中构建了一个解密器函数,并使用Openpgp.js npm模块来完成这项工作.我接受了用我们的公钥制作的各种提交的PGP客户端文件,当他们进来时使用我们的私钥解密它们,并将解密的版本放在一个文件夹供我访问,所有看起来都很好....因为文件是装甲的.以下是显示事件顺序的代码示例行:

const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8')
openpgp.decrypt({
        message: openpgp.message.readArmored(encryptedData),
        publicKeys,
        privateKey
}).then( (decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data } )
Run Code Online (Sandbox Code Playgroud)

当装甲文件通过时,一切都很顺利,我在指定的文件夹中获取解密文件.在文本编辑器中打开时,这些文件的格式如下:

-----BEGIN PGP MESSAGE-----
WBh2X7KwfEBDx0LEE1FzlnvxZs44o62FclpTazJpcl9J7DjwVfg9cHCID0TAN6Y6
B3b5bCQQFe1wTgpIkVtd0mFGQx7KGHj4FGte53qseVxC2bfq9PGKRIAUg6olr+82
Run Code Online (Sandbox Code Playgroud)

但是,我们有客户端使用装甲选项关闭加密文件,因此在文本编辑器中打开时它们会以十六进制格式出现....

7403 436d e6c0 f941 daac 945b 9a81 f066
6cd2 0032 5df0 9ca2 23a0 6eec a7bb f24c
a941 99a8 1053 ae23 f88b 245c f709 c2b2
Run Code Online (Sandbox Code Playgroud)

.....或编码文本文件,如下所示:

DµÉ‰í+?3K€Ð?˜PªeZ_|Ò®ó0??ãZqRµ3!ŒpuÉW?NZrìÚk´
Aˆ›œiêø8?Ú?ól:äΟ”?6‡)
w?¬ÌŒWÝÚ¢?Q??œ?œ??H¨¿?œ//?ÃBA?´>(%°?e?
Run Code Online (Sandbox Code Playgroud)

(最后两个类似于我在代码示例中控制日志"encryptedData"时所看到的内容.)

每当有任何非装甲文件进入时,该过程都会失败,我最初会遇到几个不同的错误,具体取决于上面显示的类型.我在fs.readFileSync上删除了'utf8'编码,并将"fromBinary"替换为"readArmored"以将数据作为可能有效的二进制思想处理,但随后我收到有关"无效的解密会话密钥"的错误.所以我尝试在主解密之前使用"decryptSessionKey"函数,因为它在文档中显示,这让我得到一个未定义的密钥和一个关于"没有找到对称加密的会话密钥包"的错误.此外,我可能正在咆哮错误的树,因为使用Openpgp.js的二进制文件似乎需要一个密码,我认为这不同于解锁我的私钥的密码,这是我唯一的密码.

我已经搜索了整个Openpgp.js文档和谷歌搜索疯狂,但似乎无法找到一个可靠的程序,如何修改我的代码,适用于ASCII装甲文件解密非装甲文件.(但是,当使用像PGP桌面这样的桌面解密程序时,每个进来的文件都会快速解密并且没有错误,所以我无法弄清楚我的差异在哪里以及为什么解决方案不明显.)任何人都有任何经验有这个或可能的解决方案?

Sto*_*bor 2

非装甲版本openpgp.message.readArmored()openpgp.message.read()

所以这样的事情应该有效:

const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8')

if encryptedData.startsWith('-----BEGIN PGP MESSAGE-----')
    encryptedMessage = openpgp.message.readArmored(encryptedData)
else
    var TextEncoder = require('text-encoding').TextEncoder;
    var encryptedUint8 = new TextEncoder().encode(encryptedData);
    encryptedMessage = openpgp.message.read(encryptedUint8)

openpgp.decrypt({
    message: encryptedMessage,
    publicKeys,
    privateKey
}).then( (decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data } )
Run Code Online (Sandbox Code Playgroud)

var TextEncoder如果您在代码中较早加载 TextEncoder,则此处不需要该行)