Golang RSA加密,错误为“无法解析公钥”

时间:2018-07-24 04:10:58

标签: go encryption rsa

当我只想简单加密短字符串时遇到麻烦。

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

错误是:

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

似乎是解析公钥的过程, 但我不知道我做错了什么... 接下来我该怎么办?谢谢:(

1 个答案:

答案 0 :(得分:1)

您需要使用x509.ParsePKIXPublicKey,检查Parse...函数返回的错误,并在使用它之前执行类型检查以确保它是RSA密钥。

您的代码将变为:

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

请不要跳过错误。在这种情况下,ParsePKCS1PublicKey将返回与asn1: structure error: tags don't match ...相似的内容,表示格式错误。