1.生成秘钥对并写入磁盘文件

1.使用ecdsa生成秘钥对

2.将私钥写入磁盘

  • 使用x509进行反序列化
  • 将得到的切片字符串放到pem.Block结构体中
  • 使用pem编码

3.将公钥写入磁盘

  • 从私钥中得到公钥
  • 使用x509进行序列化
  • 将得到的切片字符串放入pem.Block结构体中
  • 使用pem编码

2.使用私钥进行数字签名

1.打开私钥文件,将内容读出来

2.使用pem进行数据解码

3.使用x509对数据还原

4.对原始数据进行哈希运算

5.进行数字签名
func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error)
6.返回值为指针,因此需要将该地址指向内存中的数据进行序列话

3.使用公钥验证数字签名

1.打开公钥文件,读出数据

2.使用pem进行解码

3.使用x509进行公钥数据还原
func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error)

4.由于上一步返回的是一个接口类型,因此需要进行类型断言,将接口类型转换为公钥

5.对原始数据进行哈希运算

6.验签

4.go中应用

package mainimport ("crypto/ecdsa""crypto/elliptic""crypto/rand""crypto/x509""encoding/pem""os""crypto/sha256""math/big"
)func GenerateEcdsaKey () {//1.使用ecdsa生成秘钥对privateKey, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)if err != nil {panic(err)}//2.将私钥写入磁盘//* 使用x509进行反序列化ecPrivateKey, err := x509.MarshalECPrivateKey(privateKey)if err != nil {panic(err)}//* 将得到的切片字符串放到pem.Block结构体中block := pem.Block{Type:    "ecdsa private key",Headers: nil,Bytes:   ecPrivateKey,}//* 使用pem编码file, err := os.Create("ecPrivate.pem")if err != nil {panic(err)}defer file.Close()err = pem.Encode(file, &block)if err != nil {panic(err)}//3.将公钥写入磁盘//* 从私钥中得到公钥publicKey := privateKey.PublicKey//* 使用x509进行序列化ecPublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)if err != nil {panic(err)}//* 将得到的切片字符串放入pem.Block结构体中block = pem.Block{Type:    "ecdsa public key",Headers: nil,Bytes:   ecPublicKey,}//* 使用pem编码file, err = os.Create("ecPublic.pem")if err != nil {panic(err)}defer file.Close()pem.Encode(file, &block)
}//签名
func SignECDSA (plainText []byte, priFileName string) (rText, sText []byte) {//1.打开私钥文件,将内容读出来file, err := os.Open(priFileName)if err != nil {panic(err)}defer file.Close()fileInfo, err := file.Stat()if err != nil {panic(err)}buf := make([]byte, fileInfo.Size())_, err = file.Read(buf)if err != nil {panic(err)}//2.使用pem进行数据解码block, _ := pem.Decode(buf)//3.使用x509对数据还原privateKey, err := x509.ParseECPrivateKey(block.Bytes)if err != nil {panic(err)}//4.对原始数据进行哈希运算hashText := sha256.Sum256(plainText)//5.进行数字签名var r, s *big.Int //注意这里r, s, err = ecdsa.Sign(rand.Reader, privateKey, hashText[:])if err != nil {panic(err)}//6.返回值为指针,因此需要将该地址指向内存中的数据进行序列话rText, err = r.MarshalText()if err != nil {panic(err)}sText, err = s.MarshalText()if err != nil {panic(err)}return rText,sText
}//验签
func VerifyECDSA (plainText, rText, sText []byte, pubFileName string) bool {//1.打开公钥文件,读出数据file, err := os.Open(pubFileName)if err != nil {panic(err)}defer file.Close()fileInfo, err := file.Stat()if err != nil {panic(err)}buf := make([]byte, fileInfo.Size())_, err = file.Read(buf)if err != nil {panic(err)}//2.使用pem进行解码block, _ := pem.Decode(buf)//3.使用x509进行公钥数据还原pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)if err != nil {panic(err)}//4.由于上一步返回的是一个接口类型,因此需要进行类型断言,将接口类型转换为公钥publicKey := pubInterface.(*ecdsa.PublicKey)//5.对原始数据进行哈希运算hashText := sha256.Sum256(plainText)//6.验签var r, s big.Intr.UnmarshalText(rText)s.UnmarshalText(sText)res := ecdsa.Verify(publicKey, hashText[:], &r, &s)return res
}

密码技术--椭圆曲线算法EDCSA数字签名及Go语言应用相关推荐

  1. [转]密码技术-实现数字信封和数字签名

    密码技术-实现数字信封和数字签名 转载自:http://hi.baidu.com/king0332/item/ea9b19da597aec17e1f46f5b 数字信封是公钥密码体制在实际中的一个应用 ...

  2. 密码技术--国密SM3哈希算法及Go语言应用

    SM3杂凑算法 sm3是我国国产的哈希算法,是一种密码散列函数标准,有国家密码管理局与2010年12月17日发布,该算法主要用于数字签名及验证,消息认证码生成及验证,随机数生成等,算法公开,其效率与s ...

  3. 数字签名 那些密码技术_密码学中的数字签名

    数字签名 那些密码技术 A signature is usually used to bind signatory to the message. The digital signature is t ...

  4. 数字签名技术 -- DSA算法

    DSA算法是1991年美国国家标准技术协会公布的数字签名标准(DSS)的核心算法.本质上是ElGamal数字签名算法,仅能与SHA系列算法结合,没有相应的MD融合算法. DSA算法和RSA算法的异同 ...

  5. OpenSSL密码库算法笔记——第5.1.2章 椭圆曲线算法集

    在定义椭圆曲线点群时出现了描述曲线所用算法的参数const EC_METHOD *meth,这一节就来看看这个参数有什么用处. 椭圆曲线算法集的定义如下. typedef struct ec_meth ...

  6. 车联网中密码技术的探究

    目录 一.发展 二.面临的威胁 三.密码技术在车联网中的应用 四.国密算法比较 五.总结 一.发展 物联网的实践最早可追溯到1990年施乐公司的网络可乐贩售机--Networked Coke Mach ...

  7. 阅读 《图解密码技术 第三版》的归纳和总结

    文章目录 简述 图解密码学 相关密码词汇和缩写介绍 密码技术介绍 RSA 非对称加密介绍 什么是非对称加密(公钥密码)? RAS 加解密算法公式 AES 下的模式介绍 (分组密码 || 对称密码模式介 ...

  8. 密码技术学习一:密码

    0.前言 本文是作者阅读<图解密码技术>时,学习总结的一些知识,在此推荐想要深入学习密码知识的同志,将此书作为入门书来看还是比较适合的. 1.密码技术简介 1.1加密与解密 在两者通信过程 ...

  9. 开发常见密码技术概念RSA使用示例

    一.单向散列函数 1.1 概念及术语 单向散列函数(one-way hash function)有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash value).单向散 ...

最新文章

  1. android TextView里边实现图文混配效果
  2. 论文浅尝 - ICLR2020 | 知道什么、如何以及为什么:基于方面的情感分析的近乎完整的解决方案...
  3. IIC软件模拟-读写EEPROM
  4. 如何将多个Excel合并到一个Excel中?
  5. sublime text 显示 typescript高亮
  6. 第二十三章:触发器和行为(九)
  7. 第115章 SQL函数 REPEAT
  8. java cnzz_cnzz统计图标不显示
  9. 雕虫小技也重要--数据处理中的电子表格技巧
  10. 利用GAN来为冷启动用户生成 行为特征完成yelp数据集上,冷启动垃圾识别的问题。
  11. JDK9-JDK17新特性总结
  12. js如何判断闰年?整除的符号是什么?
  13. DCMTK、ITK、VTK读取dicom信息
  14. 计算机故障维修智能检测平台管理系统,计算机检测维修与数据恢复技能大赛竞赛设备采购项目.doc...
  15. Mac上安装flink笔记
  16. [2021-09-12]我所知道的最新CSGO国服能取回皮肤的国内开箱网站大全
  17. 书籍 | 《黑天鹅》事件
  18. ROS Navigation的base_local_planner类继承关系与实现方法
  19. 人员离职it检查_一个IT离职人员的个人感受
  20. 微信如何群发消息?如何群发突破200上限?

热门文章

  1. html5g与h5的区别,H5是什么?
  2. 超级计算数据中心设计要求(征求意见稿)
  3. 数据中心绿色新技术的探讨
  4. html5 video标签不能播放视频,h5 video 视频不能正常播放
  5. java汽车生产工厂模式_什么是工厂模式java
  6. vue 获取当前位置 高德_vue高德地图获取当前位置
  7. 用python计算贷款_Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例...
  8. Bug总结:python语言中出现的import error错误的解决思路
  9. Py之keras-resnet:keras-resnet的简介、安装、使用方法之详细攻略
  10. DL之DNN:利用MultiLayerNetExtend模型【6*100+ReLU+SGD,dropout】对Mnist数据集训练来抑制过拟合