golang sha256withrsa

序文

HUAWEIの支払いはsha256withrsaを使用しますが、Baiduはそれらの多くで機能しないため、私は1つを手でノックしました。

成し遂げる

package sha256WithRsa

import (
	"crypto"
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha256"
	"crypto/x509"
	"encoding/base64"
	"encoding/pem"
	"fmt"
	"github.com/fwhezfwhez/errorx"
	"strings"
)

func Sha256WithRsa(privateRaw string, msg string) (string, error) {
    
    
	privateRaw = strings.Trim(privateRaw, "\n")
	if !strings.HasPrefix(privateRaw, "-----BEGIN RSA PRIVATE KEY-----") {
    
    
		privateRaw = fmt.Sprintf("%s\n%s\n%s", "-----BEGIN RSA PRIVATE KEY-----", privateRaw, "-----END RSA PRIVATE KEY-----")
	}

	blockPri, _ := pem.Decode([]byte(privateRaw))
	if blockPri == nil {
    
    
		return "", fmt.Errorf("blockPri is nil")
	}

	rsaPri, e := genPriKey(blockPri.Bytes, PKCS8)
	if e != nil {
    
    
		panic(e)
	}

	h := sha256.New()
	h.Write([]byte(msg))
	d := h.Sum(nil)

	signature, err := rsa.SignPKCS1v15(rand.Reader, rsaPri, crypto.SHA256, d)
	if err != nil {
    
    
		return "", errorx.Wrap(err)
	}
	encodedSig := base64.StdEncoding.EncodeToString(signature)
	return encodedSig, nil
}

const (
	PKCS1 int64 = iota
	PKCS8
)

func genPriKey(privateKey []byte, privateKeyType int64) (*rsa.PrivateKey, error) {
    
    
	var priKey *rsa.PrivateKey
	var err error
	switch privateKeyType {
    
    
	case PKCS1:
		{
    
    
			priKey, err = x509.ParsePKCS1PrivateKey([]byte(privateKey))
			if err != nil {
    
    
				return nil, err
			}
		}
	case PKCS8:
		{
    
    
			prkI, err := x509.ParsePKCS8PrivateKey([]byte(privateKey))
			if err != nil {
    
    
				return nil, err
			}
			priKey = prkI.(*rsa.PrivateKey)
		}
	default:
		{
    
    
			return nil, fmt.Errorf("unsupport private key type")
		}
	}
	return priKey, nil
}

おすすめ

転載: blog.csdn.net/fwhezfwhez/article/details/113120106