golang的SHA1withRSA的实现

 

java 采用的SHA1withRSA 

Google好久也没找到go的解决方案,查到某位大神说SHA1withRSA 是JAVA特有的封装,是先进行一个SHA1的散列,再进行一次RSA的加密,

  1. 使用SHA散列包。这会产生一个小的32字节哈希字符串,便于快速计算
  2. 使用您的私钥对该字符串进行签名

golang解决

##参考资料

##大神解决

代码

func main() {

	block, _ := pem.Decode([]byte(`-----BEGIN RSA PRIVATE KEY-----

									-----END RSA PRIVATE KEY-----
						`))

	context := "helloworld";  //需要签名的文本

	if block == nil {
		panic("私钥错误")
		return
	}

	private,err := x509.ParsePKCS8PrivateKey(block.Bytes) //之前看java demo中使用的是pkcs8
	if err != nil {
		panic("PrivateKey error")
		return
	}
	h := crypto.Hash.New(crypto.SHA1)  //进行SHA1的散列
	h.Write([]byte(context))
	hashed := h.Sum(nil)

	// 进行rsa加密签名
	signedData, err := rsa.SignPKCS1v15(rand.Reader, private.(*rsa.PrivateKey), crypto.SHA1, hashed)

	data := base64.StdEncoding.EncodeToString(signedData)

	fmt.Println(data)

}

##转载大神的封装

package common

import (
	"crypto"
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"fmt"
)

type SHAwithRSA struct {
	privateKey *rsa.PrivateKey
}

func (this *SHAwithRSA) SetPriKey(pkey []byte) {
	block, _ := pem.Decode(pkey)
	if block == nil {
		fmt.Println("pem.Decode err")
		return
	}

	//private, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	private, err := x509.ParsePKCS8PrivateKey(block.Bytes)
	if err != nil {
		fmt.Println("ParsePKCS8PrivateKey err", err)
		return
	}

	this.privateKey = private.(*rsa.PrivateKey)

	return
}

func (this *SHAwithRSA) Sign(data string) (string, error) {

	h := crypto.Hash.New(crypto.SHA1)
	h.Write([]byte(data))
	hashed := h.Sum(nil)

	signature, err := rsa.SignPKCS1v15(rand.Reader, this.privateKey,
		crypto.SHA1, hashed)
	if err != nil {
		fmt.Println("Error from signing: %s\n", err)
		return "", err
	}
	sign := base64.StdEncoding.EncodeToString(signature)  //转换成base64返回
	return sign, nil
}

你可能感兴趣的:(算法,笔记)