密码技术--椭圆曲线算法EDCSA数字签名及Go语言应用
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语言应用相关推荐
- [转]密码技术-实现数字信封和数字签名
密码技术-实现数字信封和数字签名 转载自:http://hi.baidu.com/king0332/item/ea9b19da597aec17e1f46f5b 数字信封是公钥密码体制在实际中的一个应用 ...
- 密码技术--国密SM3哈希算法及Go语言应用
SM3杂凑算法 sm3是我国国产的哈希算法,是一种密码散列函数标准,有国家密码管理局与2010年12月17日发布,该算法主要用于数字签名及验证,消息认证码生成及验证,随机数生成等,算法公开,其效率与s ...
- 数字签名 那些密码技术_密码学中的数字签名
数字签名 那些密码技术 A signature is usually used to bind signatory to the message. The digital signature is t ...
- 数字签名技术 -- DSA算法
DSA算法是1991年美国国家标准技术协会公布的数字签名标准(DSS)的核心算法.本质上是ElGamal数字签名算法,仅能与SHA系列算法结合,没有相应的MD融合算法. DSA算法和RSA算法的异同 ...
- OpenSSL密码库算法笔记——第5.1.2章 椭圆曲线算法集
在定义椭圆曲线点群时出现了描述曲线所用算法的参数const EC_METHOD *meth,这一节就来看看这个参数有什么用处. 椭圆曲线算法集的定义如下. typedef struct ec_meth ...
- 车联网中密码技术的探究
目录 一.发展 二.面临的威胁 三.密码技术在车联网中的应用 四.国密算法比较 五.总结 一.发展 物联网的实践最早可追溯到1990年施乐公司的网络可乐贩售机--Networked Coke Mach ...
- 阅读 《图解密码技术 第三版》的归纳和总结
文章目录 简述 图解密码学 相关密码词汇和缩写介绍 密码技术介绍 RSA 非对称加密介绍 什么是非对称加密(公钥密码)? RAS 加解密算法公式 AES 下的模式介绍 (分组密码 || 对称密码模式介 ...
- 密码技术学习一:密码
0.前言 本文是作者阅读<图解密码技术>时,学习总结的一些知识,在此推荐想要深入学习密码知识的同志,将此书作为入门书来看还是比较适合的. 1.密码技术简介 1.1加密与解密 在两者通信过程 ...
- 开发常见密码技术概念RSA使用示例
一.单向散列函数 1.1 概念及术语 单向散列函数(one-way hash function)有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash value).单向散 ...
最新文章
- android TextView里边实现图文混配效果
- 论文浅尝 - ICLR2020 | 知道什么、如何以及为什么:基于方面的情感分析的近乎完整的解决方案...
- IIC软件模拟-读写EEPROM
- 如何将多个Excel合并到一个Excel中?
- sublime text 显示 typescript高亮
- 第二十三章:触发器和行为(九)
- 第115章 SQL函数 REPEAT
- java cnzz_cnzz统计图标不显示
- 雕虫小技也重要--数据处理中的电子表格技巧
- 利用GAN来为冷启动用户生成 行为特征完成yelp数据集上,冷启动垃圾识别的问题。
- JDK9-JDK17新特性总结
- js如何判断闰年?整除的符号是什么?
- DCMTK、ITK、VTK读取dicom信息
- 计算机故障维修智能检测平台管理系统,计算机检测维修与数据恢复技能大赛竞赛设备采购项目.doc...
- Mac上安装flink笔记
- [2021-09-12]我所知道的最新CSGO国服能取回皮肤的国内开箱网站大全
- 书籍 | 《黑天鹅》事件
- ROS Navigation的base_local_planner类继承关系与实现方法
- 人员离职it检查_一个IT离职人员的个人感受
- 微信如何群发消息?如何群发突破200上限?
热门文章
- html5g与h5的区别,H5是什么?
- 超级计算数据中心设计要求(征求意见稿)
- 数据中心绿色新技术的探讨
- html5 video标签不能播放视频,h5 video 视频不能正常播放
- java汽车生产工厂模式_什么是工厂模式java
- vue 获取当前位置 高德_vue高德地图获取当前位置
- 用python计算贷款_Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例...
- Bug总结:python语言中出现的import error错误的解决思路
- Py之keras-resnet:keras-resnet的简介、安装、使用方法之详细攻略
- DL之DNN:利用MultiLayerNetExtend模型【6*100+ReLU+SGD,dropout】对Mnist数据集训练来抑制过拟合