1.秘钥、加密/签名字符串加密的格式

目前主要见到有hex及base64

(1)hex

针对hex的加解密

import ("encoding/hex"
)
hex.DecodeString(s string)//解密
hex.EncodeToString(src []byte) string//加密

(2)base64

import ("encoding/base64""fmt"
)// 函数原型 解密
base64.StdEncoding.DecodeString(s string) ([]byte, error)
// 函数原型 加密
base64.StdEncoding.EncodeToString(src []byte) string// 演示base64编码
encodeString := base64.StdEncoding.EncodeToString(input)
fmt.Println(encodeString)// 对上面的编码结果进行base64解码
decodeBytes, err := base64.StdEncoding.DecodeString(encodeString)
if err != nil {log.Fatalln(err)
}

2.私钥的格式

解析私钥的方式如下:

(1)PKCS1

import ("crypto/x509"
)x509.ParsePKCS1PrivateKey(der []byte) (key interface{}, err error)

(2)PKCS8

import ("crypto/x509"
)x509.ParsePKCS8PrivateKey(der []byte) (key interface{}, err error)

3.采用的数字签名算法SHA

以下应RSA sign的不同说明:

(1)SHA1

import ("crypto/sha1""crypto/rsa""crypto/rand"
)hash := sha1.New()
hash.Write([]byte(originalData))
encryptedData, err := rsa.SignPKCS1v15(rand.Reader, prvKey, crypto.SHA1, hash.Sum(nil))

(2)SHA256

import ("crypto/sha256""crypto/rsa""crypto/rand"
)hash := sha256.New()
hash.Write([]byte(originalData))
encryptedData, err := rsa.SignPKCS1v15(rand.Reader, prvKey, crypto.SHA256, hash.Sum(nil))

4.RSA使用类型

主要有加密/解密、签名/验签4中方式,且加密/解密与签名/验签均是一个相反的过程。两对是根据对公钥及私钥的使用划分的。

加密/解密是采用公钥加密,私钥解密。
签名/验签是采用私钥签名,公钥验签。

(1)加密

import ("crypto/rsa""crypto/rand"
)rsa.EncryptPKCS1v15(rand io.Reader, pub *PublicKey, msg []byte) ([]byte, error)

(2)解密

import ("crypto/rsa""crypto/rand"
)rsa.DecryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) ([]byte, error)

(3)签名

import ("crypto/rsa""crypto/rand"
)rsa.SignPKCS1v15(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error)

(4)验签

import ("crypto/rsa"
)rsa.VerifyPKCS1v15(pub *PublicKey, hash crypto.Hash, hashed []byte, sig []byte) error

5.具体的使用示例

import ("crypto/x509""crypto/rsa""encoding/hex""encoding/base64""crypto/sha1""crypto/rand"
)//(1)加密:采用sha1算法加密后转base64格式
func RsaEncryptWithSha1Base64(originalData,publicKey string)(string,error){key, _ := base64.StdEncoding.DecodeString(publicKey)pubKey, _ := x509.ParsePKIXPublicKey(key)encryptedData,err:=rsa.EncryptPKCS1v15(rand.Reader, pubKey.(*rsa.PublicKey), []byte(originalData))return base64.StdEncoding.EncodeToString(encryptedData),err
}//(2)解密:对采用sha1算法加密后转base64格式的数据进行解密(私钥PKCS1格式)
func RsaDecryptWithSha1Base64(encryptedData,privateKey string)(string,error){encryptedDecodeBytes,err:=base64.StdEncoding.DecodeString(encryptedData)if err!=nil {return "",err}key,_:=base64.StdEncoding.DecodeString(privateKey)prvKey,_:=x509.ParsePKCS1PrivateKey(key)originalData,err:=rsa.DecryptPKCS1v15(rand.Reader,prvKey,encryptedDecodeBytes)return string(originalData),err
}//(3)签名:采用sha1算法进行签名并输出为hex格式(私钥PKCS8格式)
func RsaSignWithSha1Hex(data string, prvKey string) (string, error) {keyByts, err := hex.DecodeString(prvKey)if err != nil {fmt.Println(err)return "", err}privateKey, err := x509.ParsePKCS8PrivateKey(keyByts)if err != nil {fmt.Println("ParsePKCS8PrivateKey err", err)return "", err}h := sha1.New()h.Write([]byte([]byte(data)))hash := h.Sum(nil)signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey.(*rsa.PrivateKey), crypto.SHA1, hash[:])if err != nil {fmt.Printf("Error from signing: %s\n", err)return "", err}out := hex.EncodeToString(signature)return out, nil
}//(4)验签:对采用sha1算法进行签名后转base64格式的数据进行验签
func RsaVerySignWithSha1Base64(originalData, signData, pubKey string) error{sign, err := base64.StdEncoding.DecodeString(signData)if err != nil {return err}public, _ := base64.StdEncoding.DecodeString(pubKey)pub, err := x509.ParsePKIXPublicKey(public)if err != nil {return err}hash := sha1.New()hash.Write([]byte(originalData))return rsa.VerifyPKCS1v15(pub.(*rsa.PublicKey), crypto.SHA1, hash.Sum(nil), sign)
}

golang RSA base64 加解密 签名验签相关推荐

  1. RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

    RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 原文:RSACryptoServiceProvider加密解密签名验签和DES ...

  2. js rsa验签_js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  3. RSA 加密解密签名验签

    api package v1// get请求 import "github.com/gogf/gf/v2/frame/g"type GetKeyReq struct {g.Meta ...

  4. C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic

    C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider  DESCrypto ...

  5. Java 实现 RSA 非对称加密算法-加解密和签名验签

    1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...

  6. 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 三分割据纡筹策,万古云霄一羽毛. ...

  7. [crypto]-52-python3中rsa(签名验签加密解密)aes(ecb cbc ctr)hmac的使用,以及unittest测试用

    环境: 在ubuntu14.04下,记得安装:sudo pip3 install pycrypto 代码示例1: =========================== import base64 f ...

  8. 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...

    在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...

  9. SM2加解密、签名验签

    导论 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,在我们国家商用密码体系中被用来替换RSA算法. 国产SM2算法,是基于ECC的,但二者在签名验签.加密解密过程中或许有些 ...

最新文章

  1. linux停止客户端,linux – 从客户端打印motd停止ssh登录?
  2. Android应用程序签名过程和解析过程分析
  3. P3733 [HAOI2017]八纵八横(线性基/线段树分治)
  4. Custom PuTTY Color Themes
  5. apache启服务命令_Linux系统重启apache服务命令详解
  6. RobotFramework下的http接口自动化post关键字的使用
  7. opencv 直方图
  8. dos远程登录oracle,DOS批处理下 操作telnet实现自动远程登录操作
  9. 函数响应式编程及ReactiveObjC学习笔记 (三)
  10. relocation R_X86_64_PC32 against symbol lua_newstate can not be used when making a shared object
  11. 【error】vue-cli3 报Computed property “tableData” was assigned to but it has no setter.
  12. 计算机原理与接口技术论文,微机原理与接口技术综述论文
  13. 高数_第2章多元函数微分学__偏导数的几何应用_空间曲线的切线与法平面
  14. linux filesystem not open,建立物理卷报错Can't open /dev/sdb5 exclusively. Mounted filesystem的问题解决过程记录...
  15. 命令行快速切换到指定路径
  16. 论文写作课程收获总结
  17. GNU Radio: USRP2 and N2x0 Series
  18. 【Golang】golang开发微信公众号网页授权功能
  19. KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障
  20. *oulapp的双向证书破解

热门文章

  1. 深入RESTful无状态原则
  2. Linux_文件系统、磁盘分区_RHEL7
  3. Keil逻辑分析仪的使用
  4. shape(15,)与(15,1)的区别
  5. 分布式缓存的面试题8
  6. MySQL学习之路:多实例无法启动排错
  7. 人工智能时代下的视觉合成
  8. 学习css3的弹性盒模型
  9. [3/18]Windows Server 2008 服务器配置之一DNS
  10. appium的demo编程