为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 从 openpgp.js 解密 PGP

Golang 从 openpgp.js 解密 PGP

Go
动漫人物 2022-05-10 13:42:20
在 Golang 中需要对称 PGP 解密的帮助,我一直在尝试对 OpenPGP.js 上生成的加密十六进制运行对称解密,不幸的是,在 Golang 中解密没有成功。这是JS中的加密。const openpgp = require('openpgp')async function main() {  let options = {    message: openpgp.message.fromBinary(new Uint8Array([0x01, 0x01, 0x01])), // input as Message object    passwords: ['secret stuff'],                                             // multiple passwords possible    armor: false                                                             // don't ASCII armor (for Uint8Array output)  }  const cypher_text = await openpgp.encrypt(options)  const encrypted = cypher_text.message.packets.write()  console.log(Buffer.from(encrypted).toString('hex'))  options = {    message: await openpgp.message.read(encrypted), // parse encrypted bytes    passwords: ['secret stuff'],              // decrypt with password    format: 'binary'                          // output as Uint8Array  }  const decrypted = await openpgp.decrypt(options)  console.log(decrypted.data)}main()控制台日志>>c32e040903088c4db97456263252e0ef4f42627301e0ba3323b141a9ebd0476e5fe848d3c2b6021c8c06581ae2d19f7cd23b011b4b3a68758cb6fb12287db2a9ab6fdfad97670ae995e4deb7ca313d0aa705d264850adefb20353b263fc32ff8dc571f6dce8b722ddbdf40a907Uint8Array [ 1, 1, 1 ]我的代码基于以下 GIST https://gist.github.com/jyap808/8250124package mainimport (    "bytes"    "errors"    "io/ioutil"    "log"    "golang.org/x/crypto/openpgp/armor"    "golang.org/x/crypto/openpgp/packet"    "golang.org/x/crypto/openpgp")func main() {    password := []byte("secret stuff")    packetConfig := &packet.Config{        DefaultCipher: packet.CipherAES256,    }    cypherHex := []byte("c32e040903088c4db97456263252e0ef4f42627301e0ba3323b141a9ebd0476e5fe848d3c2b6021c8c06581ae2d19f7cd23b011b4b3a68758cb6fb12287db2a9ab6fdfad97670ae995e4deb7ca313d0aa705d264850adefb20353b263fc32ff8dc571f6dce8b722ddbdf40a907")    encbuf := bytes.NewBuffer(nil)    w, err := armor.Encode(encbuf, openpgp.SignatureType, nil)    if err != nil {        log.Fatal(err)    }
查看完整描述

1 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

首先,您没有解码十六进制编码的密文。使用encoding/hex包解码数据:


ct, err := hex.DecodeString(`c32e040903088c4db97456263252e0ef4f42627301e0ba3323b141a9ebd0476e5fe848d3c2b6021c8c06581ae2d19f7cd23b011b4b3a68758cb6fb12287db2a9ab6fdfad97670ae995e4deb7ca313d0aa705d264850adefb20353b263fc32ff8dc571f6dce8b722ddbdf40a907`)

if err != nil {

    log.Fatal(err)

}

下一个问题是您错误地创建了bytes.Buffer. 您没有将数据放入缓冲区,然后调用Read什么都不做的方法(并且您确实使用数据对其进行了初始化,Read无论如何都会在解密之前“读取”所有数据)。缓冲区可以使用数据初始化,或者使用Write方法填充——在这种情况下,您只需要一个io.Reader并且可以使用bytes.NewReader.


r := bytes.NewReader(ct)

最后,您现在有 30x01个字节,您可以使用更好的格式更清楚地看到:


d, err := ioutil.ReadAll(md.UnverifiedBody)

if err != nil {

    log.Fatal(err)

}


fmt.Printf("%#v\n", d)

https://play.golang.org/p/Y3VqADQvEIH


查看完整回答
反对 回复 2022-05-10
  • 1 回答
  • 0 关注
  • 428 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信