当我只想简单加密短字符串时遇到麻烦。
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)
}
错误是:
panic: failed to parse public key
goroutine 1 [running]:
main.main()
/tmp/sandbox736400947/main.go:36 +0x4a0
似乎是解析公钥的过程, 但我不知道我做错了什么... 接下来我该怎么办?谢谢:(
答案 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 ...
相似的内容,表示格式错误。