golang的SHA1withRSA的实现

野性酷女 2022-10-31 00:53 257阅读 0赞

java 采用的SHA1withRSA

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

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

golang解决

##参考资料

##大神解决

代码

  1. func main() {
  2. block, _ := pem.Decode([]byte(`-----BEGIN RSA PRIVATE KEY-----
  3. -----END RSA PRIVATE KEY-----
  4. `))
  5. context := "helloworld"; //需要签名的文本
  6. if block == nil {
  7. panic("私钥错误")
  8. return
  9. }
  10. private,err := x509.ParsePKCS8PrivateKey(block.Bytes) //之前看java demo中使用的是pkcs8
  11. if err != nil {
  12. panic("PrivateKey error")
  13. return
  14. }
  15. h := crypto.Hash.New(crypto.SHA1) //进行SHA1的散列
  16. h.Write([]byte(context))
  17. hashed := h.Sum(nil)
  18. // 进行rsa加密签名
  19. signedData, err := rsa.SignPKCS1v15(rand.Reader, private.(*rsa.PrivateKey), crypto.SHA1, hashed)
  20. data := base64.StdEncoding.EncodeToString(signedData)
  21. fmt.Println(data)
  22. }

##转载大神的封装

  1. package common
  2. import (
  3. "crypto"
  4. "crypto/rand"
  5. "crypto/rsa"
  6. "crypto/x509"
  7. "encoding/pem"
  8. "fmt"
  9. )
  10. type SHAwithRSA struct {
  11. privateKey *rsa.PrivateKey
  12. }
  13. func (this *SHAwithRSA) SetPriKey(pkey []byte) {
  14. block, _ := pem.Decode(pkey)
  15. if block == nil {
  16. fmt.Println("pem.Decode err")
  17. return
  18. }
  19. //private, err := x509.ParsePKCS1PrivateKey(block.Bytes)
  20. private, err := x509.ParsePKCS8PrivateKey(block.Bytes)
  21. if err != nil {
  22. fmt.Println("ParsePKCS8PrivateKey err", err)
  23. return
  24. }
  25. this.privateKey = private.(*rsa.PrivateKey)
  26. return
  27. }
  28. func (this *SHAwithRSA) Sign(data string) (string, error) {
  29. h := crypto.Hash.New(crypto.SHA1)
  30. h.Write([]byte(data))
  31. hashed := h.Sum(nil)
  32. signature, err := rsa.SignPKCS1v15(rand.Reader, this.privateKey,
  33. crypto.SHA1, hashed)
  34. if err != nil {
  35. fmt.Println("Error from signing: %s\n", err)
  36. return "", err
  37. }
  38. sign := base64.StdEncoding.EncodeToString(signature) //转换成base64返回
  39. return sign, nil
  40. }

发表评论

表情:
评论列表 (有 0 条评论,257人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SHA256WithRSA

    在[上文][Link 1]中了解到SHA和RSA,工作中恰好用到扩展应用:SHA256WithRSA,本文总结下学习过程,备忘の 再提供另外一种方法,实现Java版pem密