PKCS8:全名《Public-Key Cryptography Standards (PKCS) #8: Private-Key Information Syntax Specification》,从名称可以看出它是一个专门用来存储私钥而定义的格式规范。
个人理解:PKCS1只定义了对RSA密钥的编码规范,而PKCS8则可以对范围更大的私钥进行编码!!!
本章内容只列举RSA和SM2两种类型的密钥编码。
一、公钥
1、编码
import (
x509 "github.com/tjfoc/gmsm/x509"
)
// 支持RSA/ECDSA/SM2类型
func GeneratePubKeyMarshalPKCS8(key crypto.PublicKey) ([]byte, error) {
return x509.MarshalPKIXPublicKey(key)
}
2、解码
func GeneratePubKeyUnMarshalPKCS8(data []byte) (crypto.PublicKey, error) {
return x509.ParsePKIXPublicKey(data)
}
二、私钥
1、编码
import (
nx509 "crypto/x509"
x509 "github.com/tjfoc/gmsm/x509"
)
// 支持RSA和SM2,pwd只有在SM2类型时使用
func GeneratePriKeyMarshalPKCS8(key crypto.PrivateKey, pwd []byte) ([]byte, error) {
switch key.(type) {
case *sm2.PrivateKey:
return x509.MarshalSm2PrivateKey(key.(*sm2.PrivateKey), pwd)
case *rsa.PrivateKey:
return nx509.MarshalPKCS8PrivateKey(key.(*rsa.PrivateKey))
default:
return nil, errors.New("key type unknown")
}
}
2、解码
import (
nx509 "crypto/x509"
x509 "github.com/tjfoc/gmsm/x509"
)
func GeneratePriKeyUnMarshalPKCS8(data []byte, pwd []byte) (interface{}, error) {
c, err := base64.StdEncoding.DecodeString(string(data))
if err != nil {
c = data
}
key, err := x509.ParsePKCS8PrivateKey(c, pwd)
if err != nil {
return nx509.ParsePKCS8PrivateKey(c)
} else {
return key, err
}
}