GO RSA加载公钥



你好,我想知道如何通过GO中的字符串加载RSA公钥?我读了一些文档,但我不知道如何加载它?我不想通过PEM加载,我想通过加载

-----BEGIN PUBLIC KEY-----
KEY
-----END PUBLIC KEY-----

我正在尝试使用rsa。EncryptOAEP,但我需要公钥参数,但我不知道如何做到。

func main() {
pubPem, err := pem.Decode([]byte("KEY"))
if err != nil {
fmt.Println(string(err))
return
}
if pubPem.Type != "RSA PUBLIC KEY" {
fmt.Println("not rsa?")
}
}

我试过这个,但它不起作用,因为它是pem。解码(我认为(

如注释中所述,发布的密钥是PEM编码的。你可能混淆了什么
称为KEY的部分是Base64编码的DER编码密钥,每64个字符后有换行符。如果你只有这个,添加页眉和页脚是最简单的
pem.Decode()即使在正文中没有换行符也能工作,只有页眉和页脚必须在单独的行中。

从页眉/页脚行可以推断出这是X.509/SPKI格式的公钥。ParsePKIXPublicKey()支持导入此格式的密钥。

如果要使用OAEP作为填充,则必须为加密指定OAEP参数。对于解密,必须使用相同的参数,否则解密将失败。

OAEP使用两个摘要,一个用于散列标签,另一个用于掩码生成函数MGF1。RFC8017允许彼此独立地选择两者。然而,Go目前不支持这一点,即两个摘要的选择必须相同。此外,OAEP使用默认为空的标签(出于兼容性原因不应更改(。

以下代码显示了X.509/SPKI密钥的导入,以及使用SHA256作为摘要的OAEP加密(为了简单起见,没有异常处理(:

import (
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/pem"
)
...
// X.509 SPKI key, PEM encoded
var spkiPem = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoZ67dtUTLxoXnNEzRBFB
mwukEJGC+y69cGgpNbtElQj3m4Aft/7cu9qYbTNguTSnCDt7uovZNb21u1vpZwKH
yVgFEGO4SA8RNnjhJt2D7z8RDMWX3saody7jo9TKlrPABLZGo2o8vadW8Dly/v+I
d0YDheCkVCoCEeUjQ8koXZhTwhYkGPu+vkdiqX5cUaiVTu1uzt591aO5Vw/hV4DI
hFKnOTnYXnpXiwRwtPyYoGTa64yWfi2t0bv99qz0BgDjQjD0civCe8LRXGGhyB1U
1aHjDDGEnulTYJyEqCzNGwBpzEHUjqIOXElFjt55AFGpCHAuyuoXoP3gQvoSj6RC
sQIDAQAB
-----END PUBLIC KEY-----`
/*
//Works also:
var spkiPem = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoZ67dtUTLxoXnNEzRBFBmwukEJGC+y69cGgpNbtElQj3m4Aft/7cu9qYbTNguTSnCDt7uovZNb21u1vpZwKHyVgFEGO4SA8RNnjhJt2D7z8RDMWX3saody7jo9TKlrPABLZGo2o8vadW8Dly/v+Id0YDheCkVCoCEeUjQ8koXZhTwhYkGPu+vkdiqX5cUaiVTu1uzt591aO5Vw/hV4DIhFKnOTnYXnpXiwRwtPyYoGTa64yWfi2t0bv99qz0BgDjQjD0civCe8LRXGGhyB1U1aHjDDGEnulTYJyEqCzNGwBpzEHUjqIOXElFjt55AFGpCHAuyuoXoP3gQvoSj6RCsQIDAQAB
-----END PUBLIC KEY-----`
*/
// Load X.509/SPKI key
spkiBlock, _ := pem.Decode([]byte(spkiPem))
var spkiKey *rsa.PublicKey
pubInterface, _ := x509.ParsePKIXPublicKey(spkiBlock.Bytes)
spkiKey = pubInterface.(*rsa.PublicKey)
// Encryption using OAEP
plaintext := []byte("The quick brown fox jumps over the lazy dog")
oaepLabel := []byte("")
oaepDigests := sha256.New()
ciphertext, _ := rsa.EncryptOAEP(oaepDigests, rand.Reader, spkiKey, plaintext, oaepLabel)
fmt.Println(ciphertext)

最新更新