我正在开发一个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 } )
当装甲文件通过时,一切都很顺利,我在指定的文件夹中获取解密文件。在文本编辑器中打开时,这些文件的格式如下:
-----BEGIN PGP MESSAGE-----
WBh2X7KwfEBDx0LEE1FzlnvxZs44o62FclpTazJpcl9J7DjwVfg9cHCID0TAN6Y6
B3b5bCQQFe1wTgpIkVtd0mFGQx7KGHj4FGte53qseVxC2bfq9PGKRIAUg6olr+82
但是,我们有客户端使用装甲选项关闭加密文件,因此当在文本编辑器中打开时,它们会以十六进制格式呈现....
7403 436d e6c0 f941 daac 945b 9a81 f066
6cd2 0032 5df0 9ca2 23a0 6eec a7bb f24c
a941 99a8 1053 ae23 f88b 245c f709 c2b2
.....或编码文本文件,如下所示:
DµÉ‰í+�3K€Ð�˜PªeZ_|Ò®ó0��ãZqRµ3!ŒpuÉW�NZrìÚk´
Aˆ›œiêø8�Ú�ól:äΟ”�6‡)
w�¬ÌŒWÝÚ¢�Q��œ�œ?�H¨¿�œ//�ÃBA�´>(%°�e�
(最后两个类似于我在我的代码示例中控制日志" encryptedData"上面时看到的内容。)
每当有任何非装甲文件进入时,该过程都会失败,我最初会遇到几个不同的错误,具体取决于上面显示的类型。我带走了' utf8'在fs.readFileSync上编码并放入" fromBinary"取代" readArmored"将数据作为可能有效的二进制思维来处理,但是我得到了关于"用于解密的无效会话密钥"的错误。所以我尝试使用" decryptSessionKey"在主要解密之前的函数,如文档中所示,这会得到一个未定义的密钥和一个关于"没有找到对称加密的会话密钥包的错误"。此外,我可能会咆哮错误的树,因为使用带有Openpgp.js的二进制文件似乎需要密码,我认为这与解锁我的私钥的密码不同,这是唯一的密码我有。
我已经搜索了所有Openpgp.js文档并用Google搜索过疯狂,但似乎无法找到一个可靠的程序来修改我的代码,该代码适用于ASCII装甲文件来解密非装甲文件。 (但是,当使用像PGP Desktop这样的桌面解密程序时,每个进来的文件都会快速解密并且没有错误,所以我无法弄清楚我的差异在哪里以及为什么解决方案不明显。)任何人都有这方面的经验或可能的解决方案吗?
答案 0 :(得分: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 } )
(如果您在代码中先前加载TextEncoder,则此处不需要var TextEncoder
行