目录

  • Ecc签名的Go实现
    • crypto/ecdsa包
    • 签名
    • 验证签名
    • 测试代码
  • 截图
  • 参考

在Go-数字签名详解与Rsa数字签名代码中已经讲了数字签名的原理,就不重复了

Ecc签名的Go实现

crypto/ecdsa包

func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error)

使用私钥对任意长度的hash值(必须是较大信息的hash结果)进行签名,返回签名结果(一对大整数)。私钥的安全性取决于密码读取器的熵度(随机程度)。

func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool

使用公钥验证hash值和两个大整数r、s构成的签名,并返回签名是否合法。

签名

  • 使用sha256.Sum356获取摘要
  • 使用ecdsa.Sign进行签名
  • 对r s进行序列化

// Ecc 签名
// plainText 明文
// priPath 私钥路径
// 返回 签名结果

func ECCSign(plainText []byte,priPath string) ([]byte,[]byte,error) {// get pem.Blockblock,err := util.GetKey(priPath)if err != nil{_, file, line, _ := runtime.Caller(0)return nil,nil,util.Error(file,line+1,err.Error())}// x509priKey,err := x509.ParseECPrivateKey(block.Bytes)if err != nil{_, file, line, _ := runtime.Caller(0)return nil,nil,util.Error(file,line+1,err.Error())}hashText := sha256.Sum256(plainText)// signr,s,err := ecdsa.Sign(rand.Reader,priKey,hashText[:])if err != nil{_, file, line, _ := runtime.Caller(0)return nil,nil,util.Error(file,line+1,err.Error())}// marshalrText,err := r.MarshalText()if err != nil{_, file, line, _ := runtime.Caller(0)return nil,nil,util.Error(file,line+1,err.Error())}sText,err := s.MarshalText()if err != nil{_, file, line, _ := runtime.Caller(0)return nil,nil,util.Error(file,line+1,err.Error())}return rText,sText,nil
}

验证签名

  • -使用sha256.Sum356获取摘要
  • 对r s进行反序列化
  • 使用ecdsa.Verify进行签名认证

// ECC 签名验证
// plainText 明文
// rText,sText 签名
// pubPath公钥文件路径
// 返回 验签结果 错误

func ECCVerify(plainText,rText,sText []byte,pubPath string) (bool,error) {// get pem.Blockblock,err := util.GetKey(pubPath)if err != nil{_, file, line, _ := runtime.Caller(0)return false,util.Error(file,line+1,err.Error())}// x509pubInter,err := x509.ParsePKIXPublicKey(block.Bytes)if err != nil{_, file, line, _ := runtime.Caller(0)return false,util.Error(file,line+1,err.Error())}// assertpubKey := pubInter.(*ecdsa.PublicKey)hashText := sha256.Sum256(plainText)var r,s big.Int// unmarshalerr = r.UnmarshalText(rText)if err != nil{_, file, line, _ := runtime.Caller(0)return false,util.Error(file,line+1,err.Error())}err = s.UnmarshalText(sText)if err != nil{_, file, line, _ := runtime.Caller(0)return false,util.Error(file,line+1,err.Error())}// verifyok := ecdsa.Verify(pubKey,hashText[:],&r,&s)return ok,nil
}

测试代码

 plainText := []byte("张华考上了北京大学;李萍进了中等技术学校;我在百货公司当售货员:我们都有美好的未来")rText,sText, _ := ECCSign(plainText,"./eccPrivate.pem")ok, err := ECCVerify(plainText,rText,sText,"./eccPublic.pem")fmt.Println(err)fmt.Printf("验证成功? %t",ok)

截图


全部代码放到了gitee.com/frankyu365/gocrypto

参考

《现代密码学教程 谷利泽 杨义先等》
Go标准库-crypto/ecdsa
Go-标准库-crypto/sha256

Go-ecc数字签名详解与代码相关推荐

  1. 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)

    Datawhale 作者:赵楠.杨开漠.谢文昕.张雨 寄语:本文针对5大机器学习经典算法,梳理了其模型.策略和求解等方面的内容,同时给出了其对应sklearn的参数详解和代码实现,帮助学习者入门和巩固 ...

  2. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  3. 图像质量损失函数SSIM Loss的原理详解和代码具体实现

    本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...

  4. python 自动化-Python API 自动化实战详解(纯代码)

    主要讲如何在公司利用Python 搞API自动化. 1.分层设计思路 dataPool :数据池层,里面有我们需要的各种数据,包括一些公共数据等 config :基础配置 tools : 工具层 co ...

  5. 数学建模——智能优化之遗传算法详解Python代码

    数学建模--智能优化之遗传算法详解Python代码 import numpy as np import matplotlib.pyplot as plt from matplotlib import ...

  6. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  7. 数学建模——智能优化之模拟退火模型详解Python代码

    数学建模--智能优化之模拟退火模型详解Python代码 #本功能实现最小值的求解#from matplotlib import pyplot as plt import numpy as np imp ...

  8. 数学建模——智能优化之粒子群模型详解Python代码

    数学建模--智能优化之粒子群模型详解Python代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplo ...

  9. 数学建模——支持向量机模型详解Python代码

    数学建模--支持向量机模型详解Python代码 from numpy import * import random import matplotlib.pyplot as plt import num ...

最新文章

  1. 清华寒门女孩毕业感言爆火:世界本不公平,你有多努力,就有多特殊!
  2. 亮相2018CES:解读阿里云IoT筹谋全球物联网市场的一盘大棋!
  3. 实验三:实现一个大素数生成算法
  4. android 获取设备串号,Android获取设备IMEI和Mac地址
  5. 两次深度debug经历,希望大家不要踩坑
  6. crossdomain.xml配置不当的利用和解决办法
  7. 26条安全开车经验 开车20年老司机分享
  8. style.width与offsetWidth的区别
  9. javascript判断是否手机设备+滑动事件
  10. Django魔术用法
  11. 大数据之-Hadoop3.x_MapReduce_MapTask源码解析---大数据之hadoop3.x工作笔记0126
  12. id vue2路由传参_vue 路由跳转传参
  13. Linux的链接工具 putty 以及一些命令。
  14. 【转载】在回答WCF问题时,在我们的园子找到了一篇彪悍的文章
  15. Qt::QWidget 无默认标题栏边框的拖拽修改大小方式
  16. python爬取设置了权限的qq空间_Python爬取qq空间说说的实例代码
  17. couchbase php,轻松搞定|将PHP和Couchbase应用部署为Docker
  18. java论文3000字_一篇文章让你真正了解Java(纯干货)
  19. 学习fullpage的使用
  20. NC344 Z字形输出字符串

热门文章

  1. java 异常后重试_java – 异常后自动重试的功能
  2. 初次使用HC-08蓝牙模块01
  3. 使用 Burpsuite 与 xray 进行联动
  4. ae 2019 mac16.1.1 中文直装版——After Effects CC 2019 for Mac
  5. autohotkey快捷键总结
  6. 基于RFM模型的电商零售数据分析
  7. 禁止手机浏览器浏览网页弹出跳转百度弹框
  8. CodeIgniter框架解析
  9. 解决问题的方式——>学习方式
  10. png批量转换为webp_将JPG,PNG和动画GIF转换为WEBP