Golang расшифровать PGP из openpgp. js - PullRequest
0 голосов
/ 25 января 2020

Здесь нужна помощь с симметрией c Расшифровка PGP в Golang, я пытался запустить симметричное дешифрование на зашифрованном гексе, сгенерированном в 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()

console.log >>

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

    w.Write(cypherHex)
    encbuf.Read(cypherHex)
    w.Close()

    log.Println(encbuf)

    decbuf := bytes.NewBuffer([]byte(encbuf.String()))
    armorBlock, err := armor.Decode(decbuf)
    if err != nil {
        log.Fatalf("Failed on decode %+v\n", err)
    }

    failed := false
    prompt := func(keys []openpgp.Key, symmetric bool) ([]byte, error) {
        if failed {
            return nil, errors.New("decryption failed")
        }
        return password, nil
    }

    md, err := openpgp.ReadMessage(armorBlock.Body, nil, prompt, packetConfig)
    if err != nil {
        log.Fatalf("Failed on read message %+v\n", err)
    }

    plaintext, err := ioutil.ReadAll(md.UnverifiedBody)
    if err != nil {
        log.Fatalf("Failed on read all body %+v\n", err)
    }

    log.Println(plaintext)
}

Я заметил после регистрации в инбуфе, что бронированный ключ является неполным

2020/01/24 22:51:54 jcwYWU5
OTVlNGRlYjdjYTMxM2QwYWE3MDVkMjY0ODUwYWRlZmIyMDM1M2IyNjNmYzMyZmY4
ZGM1NzFmNmRjZThiNzIyZGRiZGY0MGE5MDc=
=9ciH
-----END PGP SIGNATURE-----

Обновление: Попытка расшифровки также без брони, если происходит сбой с EOF


import (
    "bytes"
    "io/ioutil"
    "log"

    "golang.org/x/crypto/openpgp"

    "golang.org/x/crypto/openpgp/packet"
)

func main() {
    password := []byte("secret stuff")
    packetConfig := &packet.Config{
        DefaultCipher: packet.CipherAES128,
    }

    cypherHex := []byte("c32e040903088c4db97456263252e0ef4f42627301e0ba3323b141a9ebd0476e5fe848d3c2b6021c8c06581ae2d19f7cd23b011b4b3a68758cb6fb12287db2a9ab6fdfad97670ae995e4deb7ca313d0aa705d264850adefb20353b263fc32ff8dc571f6dce8b722ddbdf40a907")

    encbuf := bytes.NewBuffer(nil)
    encbuf.Read(cypherHex)

    prompt := func(keys []openpgp.Key, symmetric bool) ([]byte, error) {
        return password, nil
    }

    md, err := openpgp.ReadMessage(encbuf, nil, prompt, packetConfig)
    if err != nil {
        log.Fatalf("Failed on read message %+v\n", err)
    }

    plaintext, err := ioutil.ReadAll(md.UnverifiedBody)
    if err != nil {
        log.Fatalf("Failed on read all body %+v\n", err)
    }

    log.Println(plaintext)
}

1 Ответ

1 голос
/ 27 января 2020

Во-первых, вы не декодируете шестнадцатеричный зашифрованный текст. Используйте пакет 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)

Наконец, теперь у вас есть 3 0x01 байтов, которые вы можете увидеть более четко, используя лучшее форматирование:

d, err := ioutil.ReadAll(md.UnverifiedBody)
if err != nil {
    log.Fatal(err)
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...