Golang 从 openpgp.js 解密 PGP

在 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()

控制台日志>>


c32e040903088c4db97456263252e0ef4f42627301e0ba3323b141a9ebd0476e5fe848d3c2b6021c8c06581ae2d19f7cd23b011b4b3a68758cb6fb12287db2a9ab6fdfad97670ae995e4deb7ca313d0aa705d264850adefb20353b263fc32ff8dc571f6dce8b722ddbdf40a907


Uint8Array [ 1, 1, 1 ]

我的代码基于以下 GIST https://gist.github.com/jyap808/8250124


package main


import (

    "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)

    }


动漫人物
浏览 429回答 1
1回答

有只小跳蛙

首先,您没有解码十六进制编码的密文。使用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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go