你好,我想知道如何通过字符串加载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.Decode (我认为)
发布于 2022-01-15 08:03:13
正如注释中已经描述的,已发布的密钥是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)https://stackoverflow.com/questions/70718821
复制相似问题