介绍

数字签名就是只有消息的发送者才能产生的别人无法伪造的一段数字串,这段数字串是对信息真实性的有效证明。

  • 发送者:生成签名
  • 接受者:验证签名

非对称密码机制

非对称加密中,公钥用于加密,私钥用于解密。数字签名中相反,私钥生成签名,公钥验证签名

数字签名方法

直接对消息签名

对消息的散列值签名

先用单向散列函数求出消息的散列值,然后再将散列值进行加密。

数字签名算法

RSA

案例一

package mainimport ("crypto/rsa""crypto/rand""fmt""crypto/md5""encoding/base64""crypto"
)//用公钥加密,私钥解密
//用私钥签名,公钥验证
//公钥是公开的,任何人可以使用公钥,私钥非公开(保存好)//一,编程实现,公钥加密,私钥解密的过程
func crypt() {//创建私钥priv, _ := rsa.GenerateKey(rand.Reader, 1024)fmt.Println("输出系统自动产生的私钥", priv)//创建公钥pub := priv.PublicKey//准备加密的明文org := []byte("hello kongyixueyuan")//公钥加密cipherTxt, _ := rsa.EncryptOAEP(md5.New(), rand.Reader, &pub, org, nil)//打印密文fmt.Println("密文为:", cipherTxt)fmt.Println("密文为:", base64.StdEncoding.EncodeToString(cipherTxt))//用私钥解密plaintext, _ := rsa.DecryptOAEP(md5.New(), rand.Reader, priv, cipherTxt, nil)//打印解密后的结果fmt.Println("明文为:", string(plaintext))}//二,编程实现,私钥签名,公钥验证的过程
func sign() {//创建私钥priv, _ := rsa.GenerateKey(rand.Reader, 1024)//创建公钥pub := &priv.PublicKeyplaintxt := []byte("zhaoyingkui")//实现hash散列h := md5.New()h.Write(plaintxt)hashed := h.Sum(nil)//通过RSA实现数字签名//数组签名的作用为验证是否被篡改,A->B,当B收到数据时,验证是否由A传递的消息opts := rsa.PSSOptions{rsa.PSSSaltLengthAuto, crypto.MD5}sig, _ := rsa.SignPSS(rand.Reader, priv, crypto.MD5, hashed, &opts)fmt.Println("签名的结果为", sig)//通过公钥实现验证签名err := rsa.VerifyPSS(pub, crypto.MD5, hashed, sig, &opts)if err == nil {fmt.Println("验证成功")}}func main() {//crypt()sign()}

案例二
server.go

package mainimport ("net""fmt""encoding/pem""crypto/x509""crypto/rsa""crypto/md5""crypto"
)//接收网络传送过来的数据
//公钥验签
var publicKey = []byte(`
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyOnQ8Dbm1/UIkmSfeMKd
K1LRJGX7T18vjZ7P4w3f/Jft/LKCwkxyC2H7x03An+EdHP7dreRhNytzbQaseIgH
EYjFapaCEz+JpMNm+qY4ZpApzvPvqm/tut4T1J0HG33iiBqnyMJRZg8LjUXV2tEw
fnHm5yCX36kOkN/YCW7ZbeO6aqw7gMyvJDiLGIYgCy2Daqe1MH1RP91djrt6tWcf
qVmUR+HxvJFkvUZZHqFUUZyJefNcY7JQDLSz5F22VB7ZLd9sSX38My353pNy4D19
yeo5/54Z5AbSeRUMYJSFFbxwJzfewyVq2nV7EUJEj7lk0NmksB+S6w1a+a8cWydJ
/QIDAQAB
-----END PUBLIC KEY-----
`)func Recive() []byte {netListen, _ := net.Listen("tcp", "127.0.0.1:1234")defer netListen.Close()//监听端口,并接收数据for {conn, _ := netListen.Accept()//设置接收数据的内存缓存data := make([]byte, 2048)for {n, _ := conn.Read(data)//返回接收的数据return data[:n]}}
}func main() {//fmt.Println(Recive())//获得接收到的数据data := Recive()//拆分数据plaintxt := data[:11]fmt.Println("接收的名文为", string(plaintxt))//获得接收到的数据中的数字签名的结果sig := data[11:]//通过公钥做验证block, _ := pem.Decode(publicKey)pubInterface, _ := x509.ParsePKIXPublicKey(block.Bytes)pub := pubInterface.(*rsa.PublicKey)//验证发送方是否为zhaoyingkuih := md5.New()h.Write([]byte(plaintxt))hashed := h.Sum(nil)e := rsa.VerifyPSS(pub, crypto.MD5, hashed, sig, nil)if e == nil {fmt.Println("接受数据成功,数据确实是",string(plaintxt))}}

client.go

package mainimport ("crypto/md5""encoding/pem""crypto/x509""crypto/rsa""crypto""crypto/rand""net""fmt"
)//发送消息,需要对数据进行签名
//私钥做签名
var privateKey = []byte(`
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAyOnQ8Dbm1/UIkmSfeMKdK1LRJGX7T18vjZ7P4w3f/Jft/LKC
wkxyC2H7x03An+EdHP7dreRhNytzbQaseIgHEYjFapaCEz+JpMNm+qY4ZpApzvPv
qm/tut4T1J0HG33iiBqnyMJRZg8LjUXV2tEwfnHm5yCX36kOkN/YCW7ZbeO6aqw7
gMyvJDiLGIYgCy2Daqe1MH1RP91djrt6tWcfqVmUR+HxvJFkvUZZHqFUUZyJefNc
Y7JQDLSz5F22VB7ZLd9sSX38My353pNy4D19yeo5/54Z5AbSeRUMYJSFFbxwJzfe
wyVq2nV7EUJEj7lk0NmksB+S6w1a+a8cWydJ/QIDAQABAoIBAAQo+z+OE3eTRksp
tDee5/w2qcf0KKD7GpP3HtzXs7SaPL5Hv/df99iOfdUhogRtd9na2SI5oV2wE6LF
SZrxThwp1dSgKy9U2HfF6AL2oCJXh9YWLPc9fBGreYOkgLosAB3LV4ALrf3L//Q7
5vKx9CwaFarhfOOPr5KGYAXJ+syQqi3CjQrPGTLsoyYPB5oc5CA45eHIctoS90M3
cCRb5pu8vlbmeMUh9G9GMdjD3zuefndOBnwcpErLf2xPuM/Qav9LI7bP25UaZe1u
zuTm93AjAtjS9zTvyqbVx/xq7C+LA4EaEeBzxNuUPHAGEhuf4kQGOPl48XKM3aNk
lc/UoUECgYEA5vTg6lJKkyHvA5JJvOLSRqrGd220TvO0EPmdp3PUGSFWdldC1ev1
M42f8tbzBBeQJlIMBTeGi5Sa8QRVVZXWYmjKkcpDreZJCKz4dVPyeg93MRUhDA7J
8+2GSypKO+MpTty3WY7y0K0Lyk7381to7QTfqXzMc1d/Q/W2rqdrITECgYEA3rL3
4EzaxisRG9yaxu1ndGFcaTX9JUm+RTDPd5wecfE2mrSqfWwcXjsJ/BOqim1pwPQe
1/7e6PwyPqqd9It+E5f3zLwN5fvHISSjawU+sCLgpPY4YQvybf2cLsfyQrIQw1Ig
4Mo+DTBp4EAGYLszn/8yk7A6PIkev/+W22s1oo0CgYEArYriGpC9QrOj4t4glFMn
yDv4p7MCYrUS4BKA2VvaywtW6dOGADKubA+GWbYUo0WFZpYOPDlN20JN7r7f1FC1
6Axv8n62vkwlIuS+SYNL11YZrQMAcwwFykn3uDFN2JRH7N9C0oPshssQ6fLOs8lD
HZ6k5blF84GSuqE+pRxeDnECgYAagUJvN7ZyD34hysfBFVBS0aOmAf73CSfUJFMM
8U/OT98n2ojQFKXrsSsnDVAm2Y7UoDlri7IMGLgCLVxPVqrSuiuL+nXNAYJZt3qb
qiwj2oLSH1vmcP2RibWk+7chqP/Fv2iaWHe6KiDvx676pE0opb7nRPopakh2oXz1
8I+ZoQKBgDR/aXBDXcDzHC4dM3dYzkSf0bn8LXyANkEjHovSH/QSs4m+d2BkGlSy
yB3kgNSnEa9vNoffQcRvRlQbS58zTF8Z4iGjnoCHS6Q2yJBFm9L+EaRJlF6tOERk
ngLn8mAtV/IGigWBpZCVeEIHH1nG1DLatF2VDCQifQXZ5oRcZZr6
-----END RSA PRIVATE KEY-----
`)func SignData(msg string) []byte {//准备签名的数据plaintxt:=[]byte(msg)h:=md5.New()h.Write(plaintxt)hashed:=h.Sum(nil)fmt.Println(hashed)//将字节数组转换成私钥类型block,_:=pem.Decode(privateKey)priv,_:=x509.ParsePKCS1PrivateKey(block.Bytes)//签名opts:=&rsa.PSSOptions{rsa.PSSSaltLengthAuto,crypto.MD5}sig,_:=rsa.SignPSS(rand.Reader,priv,crypto.MD5,hashed,opts)//返回签名结果return sig
}//通过TCP将数据和签名结果发送给接收端
func Send(data []byte) {conn,_:=net.ResolveTCPAddr("tcp4","127.0.0.1:1234")n,_:=net.DialTCP("tcp",nil,conn)//将数据通过tcp协议发送给接收方n.Write(data)fmt.Println("发送结束")}func main() {//获得签名的结果var dt = "hello world"sg:=SignData(dt)//dt是准发送出去的数据var data = make([]byte,len(dt)+len(sg))copy(data[0:11],[]byte(dt))copy(data[11:],sg)//data数组其实有两部分组成,发出去的数据+签名结果Send(data)
}

DSA

ECDSA

一种利用椭圆曲线密码来实现的数字签名算法。

【go密码学】-数字签名相关推荐

  1. 密码学–数字签名Digital Signature五种分类

    密码学–数字签名Digital Signature五种分类 基于数字签名用途的分类 基于数学难题的分类 基于密码体制的分类 基于数字签名安全性的分类 基于签名用户的个数分类 A. 基于数字签名用途的分 ...

  2. [密码学] 数字签名基础

    文章目录 基础内容 数字签名的组成 密钥生成算法KeyGen 签名算法Sig 验证算法Vrfy RSA签名 密钥生成 签名 验证 RSA签名攻击 攻击目的 攻击手段 唯密钥攻击下的存在性伪造 已知消息 ...

  3. 密码学---数字签名和认证协议---数字签名的基本概念

    数字签名的基本概念 数字签名应该满足的条件 数字签名的产生方式 由加密算法产生 单钥加密 公钥加密 实例 总结 由签名算法产生 数字签名的执行方式 直接方式 具有仲裁的方式 实例 数字签名应该满足的条 ...

  4. 密码学---数字签名和认证协议---数字签名标准

    数字签名标准 DSS的基本方式 RSA签名过程 DSS签名过程 数字签名算法DSA 全局公钥 用户私钥x 用户公钥y 用户为待签消息选取的秘密数k 签名过程 验证过程 数字签名标准(Digital S ...

  5. 数据安全需要做什么?

    信息安全或信息安全有对立的两方面的含义:一是数据本身的安全,主要是指采用现代密码算法对数据进行主动保护,如数据保密.数据完整性.双向强身份认证等,二是数据防护的安全,主要是采用现代信息存储手段对数据进 ...

  6. 【区块链实战】什么是区块链,为什么会产生区块链技术

    目录 一.内容导读 二.知识点 区块链 分布式账本 密码学 数字签名 双花攻击 数据结构 三.区块链技术为什么会产生 1.账本不能丢失或损坏 2.账本不能被篡改 3.证明你是你 4.同一样一份货币资产 ...

  7. 每天学一点网站安全相关的小知识

    文章目录 网站中的常见的安全问题 SQL注入漏洞 Mybatis框架下易产生SQL注入漏洞场景分析 XSS 攻击 CSRF 攻击 密码学 数字签名(digital signature)和 数字证书(d ...

  8. ai自动生成字幕_使用AI对您的会议进行现场字幕

    ai自动生成字幕 Many people rely on captions every day. Unfortunately, not everything has captions; this of ...

  9. 数据上链的原则与方式

    由于区块链技术众所周知的不可篡改的特性,很多人就将区块链作为一个数据库来使用,在传统项目进行区块链改造的过程中,将所有本来存入传统RDBMS(关系数据库)的数据,全部改成存入区块链中,以为这就是区块链 ...

  10. 《NJUPT》网络信息安全_期末PPT整理笔记

    零.基础知识 信息安全包括:信息安全管理.物理场所安全.设备的硬件安全.软件安全(操作系统/其他系统软件应用软件).网络信息安全(TCP/IP ).密码学的应用.信息隐藏.其他不常见技术 不同的研究方 ...

最新文章

  1. python链表添加多个值_Python基础10之数据结构(下)
  2. boost::sort模块实现支持不同分布的随机数生成器的测试程序
  3. boost::math::hyperexponential用法的测试程序
  4. docker和docker-compose 端口映射
  5. Python中的traceback模块
  6. YBTOJ洛谷P2387: 魔法森林(LCT)
  7. 软件测试框架课程考试_那考试准备课程值得吗?
  8. 注册.NET Framework
  9. java ecc signature_如何用python验证android/java的ECC签名
  10. java经纬度凸包graham_计算几何-凸包-Graham算法
  11. Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错
  12. 秋招复习-后端(C++)
  13. jsp水果商城系统毕业设计网站成品论文
  14. Unix环境高级编程(十)信号续
  15. python绘制相频特性曲线_python skimage图像处理(二)
  16. gulp-rev-append md5版本号
  17. c语言逻辑推理题大全,C语言逻辑推理例题(附答案)
  18. 数据库SQL语句总结大全
  19. 科学计算机求年金,科普如何科学使用普通计算器(CPA考试小技巧)
  20. 从零实现一个RPC框架系列文章(二):11个类实现简单RPC

热门文章

  1. SMS基本概念和移动通信系统介绍(转)
  2. 嵌入式linux initramfs,linux的initrd机制和initramfs机制之initramfs
  3. AI智能外呼机器人网络拓扑结构笔记
  4. CNN卷积神经网络实例(基于pytorch)
  5. python以字典初始化数据_Python 简明教程 ---12,Python 字典
  6. IDEA如何配置Maven及版本统一管理
  7. 2022金属非金属矿山(小型露天采石场)安全管理人员考试模拟100题及答案
  8. 微信/企业微信-本地(MAC)VUE项目调用JS-SDK,开发测试环境搭建
  9. 【linux】循序渐进学运维-基础篇-yum管理
  10. 图的代数表示: 邻接矩阵与关联矩阵