0

I have a trouble when I just want to simply encrypt a short string.

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "encoding/pem"
    "fmt"
    "log"
)

func main() {

    var pwd = "1234"
    var pwdB = []byte(pwd)

    fmt.Println(pwd)
    fmt.Println(pwdB)

    const pemPublicKey = `-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALE0I2XX+IzlhIfBx2KoYqcxlEU23oje
PTJzJ7GoYyK4R5gCkWV6ltyLN5G+rNkfsAnTObqIJK+sQzcqmm9up88CAwEAAQ==
-----END PUBLIC KEY-----`

    fmt.Println(pemPublicKey)

    block, _ := pem.Decode([]byte(pemPublicKey))
    if block == nil {
        panic("failed to parse PEM block containing the public key")
    }
    fmt.Println(block)

    pkey, _ := x509.ParsePKCS1PublicKey(block.Bytes)
    if pkey == nil {
        panic("failed to parse public key")
    }

    fmt.Println(pkey)

    in, err := rsa.EncryptPKCS1v15(rand.Reader, pkey, pwdB)
    if err != nil {
        log.Fatalf("encrypt: %s", err)
    }

    fmt.Println(in)
}

playground link

The error is :

panic: failed to parse public key
goroutine 1 [running]:
main.main()
    /tmp/sandbox736400947/main.go:36 +0x4a0

It seems that is the process in Parsing the public key, but I don't know what have I done wrong... What should I do next? Thanks :(

1
  • Next you should not discard the error from ParsePKCS1PublicKey. Commented Jul 24, 2018 at 6:46

1 Answer 1

2

You need to use x509.ParsePKIXPublicKey, check the error returned by the Parse... function, and perform a type check to make sure it is a RSA key before using it.

Your code would become:

pkey, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
    panic(err)
}

rsaKey, ok := pkey.(*rsa.PublicKey)
if !ok {
    log.Fatalf("got unexpected key type: %T", pkey)
}

Please don't skip errors. In this case, ParsePKCS1PublicKey would have returned something along the lines of asn1: structure error: tags don't match ... which indicates a bad format.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.