首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenPGP.js解密非装甲PGP文件

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

Stack Overflow用户
提问于 2017-02-16 14:30:45
回答 1查看 5K关注 0票数 9

我正在开发一个Node应用程序,我已经在其中构建了一个解密函数,并使用了Openpgp.js npm模块来实现这一功能。我接收了各种提交的PGP客户端文件,使用我们的公钥,当它们进来时,使用我们的私钥解密它们,并将解密后的版本放在一个文件夹中供我访问,只要文件是装甲的,所有这些似乎都是well....as。以下是显示事件顺序的一些代码样例行:

代码语言:javascript
复制
const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8')
openpgp.decrypt({
        message: openpgp.message.readArmored(encryptedData),
        publicKeys,
        privateKey
}).then( (decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data } )

当一个装甲文件通过时,一切正常,我在指定的文件夹中得到解密的文件。在文本编辑器中打开这些文件时,格式如下:

代码语言:javascript
复制
-----BEGIN PGP MESSAGE-----
WBh2X7KwfEBDx0LEE1FzlnvxZs44o62FclpTazJpcl9J7DjwVfg9cHCID0TAN6Y6
B3b5bCQQFe1wTgpIkVtd0mFGQx7KGHj4FGte53qseVxC2bfq9PGKRIAUg6olr+82

但是,我们有一些客户端在关闭armored选项的情况下对文件进行加密,因此当在文本编辑器中打开文件时,这些文件是十六进制格式的……

代码语言:javascript
复制
7403 436d e6c0 f941 daac 945b 9a81 f066
6cd2 0032 5df0 9ca2 23a0 6eec a7bb f24c
a941 99a8 1053 ae23 f88b 245c f709 c2b2

.....or作为编码的文本文件,如下所示:

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

(后两个类似于我在上面的代码示例中通过控制台记录"encryptedData“时看到的内容。)

每当有任何非装甲文件进入时,该过程都会失败,我最初收到了几个不同的错误,具体取决于上面显示的类型。我去掉了fs.readFileSync上的'utf8‘编码,用"fromBinary“代替"readArmored”来处理二进制数据,认为这样可能行得通,但之后我得到了关于“解密的会话密钥无效”的错误信息。因此,我尝试在主解密之前使用"decryptSessionKey“函数,因为它在文档中显示,这会得到一个未定义的密钥和一个关于”没有找到对称加密的会话密钥包“的错误。此外,我可能找错了地方,因为在Openpgp.js中使用二进制似乎需要一个密码,我认为这与解锁我的私钥的密码短语不同,这是我拥有的唯一密码。

我搜索了所有的Openpgp.js文档,疯狂地谷歌了一下,但似乎找不到一个可靠的程序来修改我的代码,它适用于ASCII装甲文件,以解密未装甲的文件。(然而,当使用像PGP Desktop这样的桌面解密程序时,进入的每个文件都可以快速且没有错误地解密,所以我不知道我的差异在哪里,为什么解决方案不明显。)有人对此有任何经验或可能的解决方案吗?

EN

回答 1

Stack Overflow用户

发布于 2017-03-01 09:43:09

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

所以像这样的东西应该是有效的:

代码语言:javascript
复制
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行)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42266533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档