基于Go调用国密SM2算法
// 一下为tool.go,辅助函数
/*保存系统参数*/
func saveOneValue(filename string,save *big.Int) {outputFile, outputError := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)//os.O_APPEND追加if outputError != nil {fmt.Println(outputError)return}defer outputFile.Close()outputWriter := bufio.NewWriter(outputFile)outputWriter.WriteString(save.String()+"\n")// 一定得记得将缓冲区内容刷新到磁盘文件outputWriter.Flush()
}/*保存各个成员的参数情况——用于测试*/
func saveValue(filename string,save []*big.Int) {//写文件 保存p值k := len(save)outputFile, outputError := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)//os.O_APPEND追加if outputError != nil {fmt.Println(outputError)return}defer outputFile.Close()outputWriter := bufio.NewWriter(outputFile)for i := 0; i < k; i++ {outputWriter.WriteString(save[i].String()+"\n")}// 一定得记得将缓冲区内容刷新到磁盘文件outputWriter.Flush()
}/*读取各个成员的参数情况——用于测试*/
func ReadValue(filename string) (re []*big.Int) {temp := new(big.Int)inputFile, inputError := os.Open(filename)if inputError != nil {fmt.Println(inputError)return nil}defer inputFile.Close()inputReader := bufio.NewReader(inputFile)for {inputString, readerError := inputReader.ReadString('\n')temp.SetString(inputString,10)re = append(re,new(big.Int).Set(temp))if readerError == io.EOF {break}}return re
}/*读取系统参数情况*/
func ReadOneValue(filename string) (*big.Int) {re := new(big.Int)inputFile, inputError := os.Open(filename)if inputError != nil {fmt.Println(inputError)return nil}defer inputFile.Close()inputReader := bufio.NewReader(inputFile)for {inputString, readerError := inputReader.ReadString('\n')re.SetString(inputString,10)if readerError == io.EOF {break}}return re
}
以下代码
package toolimport ("crypto/rand""github.com/pkg/errors""github.com/tjfoc/gmsm/sm2""log""math/big"
)/*用于生成sm2密钥对密钥对将会存储在sm2Value*/
func GetSm2Keys() {priv, err := sm2.GenerateKey(rand.Reader) // 生成密钥对if err != nil {log.Fatal(err)}pub := &priv.PublicKeyvar values []*big.Intvalues = append(values, priv.D,pub.X,pub.Y)saveValue("sm2Value.txt",values)
}/*使用对方的公钥加密content是需要加密的内容*/
func CreateSm2Encrypt(msg []byte) ([]byte,*sm2.PublicKey,error) {//读取密钥对re := ReadValue("sm2Value.txt")if len(re)<3 {return nil,nil,errors.New("文件内容损坏!")}c := sm2.P256Sm2()priv := new(sm2.PrivateKey)priv.PublicKey.Curve = cpriv.D = new(big.Int).Set(re[0])priv.PublicKey.X, priv.PublicKey.Y = new(big.Int).Set(re[1]),new(big.Int).Set(re[2])pub := &priv.PublicKeyciphertxt, err := pub.EncryptAsn1(msg,rand.Reader) //sm2加密if err != nil {return nil, nil, err}return ciphertxt,pub,nil
}/*私钥进行解密操作需要使用匹配的私钥进行解密
*/
func Sm2Decrypt(ciphertxt []byte) (string,error) {//读取密钥对re := ReadValue("sm2Value.txt")if len(re)<3 {return "", errors.New("文件内容损坏!")}c := sm2.P256Sm2()priv := new(sm2.PrivateKey)priv.PublicKey.Curve = cpriv.D = new(big.Int).Set(re[0])priv.PublicKey.X, priv.PublicKey.Y = new(big.Int).Set(re[1]),new(big.Int).Set(re[2])plaintxt,err := priv.DecryptAsn1(ciphertxt) //sm2解密if err != nil {return "", err}return string(plaintxt),nil
}/*使用私钥创建签名*/
func CreateSm2Sig(msg []byte) ([]byte,*sm2.PublicKey,error) {//读取密钥对re := ReadValue("sm2Value.txt")if len(re)<3 {return nil,nil, errors.New("文件内容损坏!")}c := sm2.P256Sm2()priv := new(sm2.PrivateKey)priv.PublicKey.Curve = cpriv.D = new(big.Int).Set(re[0])priv.PublicKey.X, priv.PublicKey.Y = new(big.Int).Set(re[1]),new(big.Int).Set(re[2])sign,err := priv.Sign(rand.Reader, msg, nil) //sm2签名if err != nil {return nil,nil, err}return sign,&priv.PublicKey,err
}/*验证签名是否正常*/
func VerSm2Sig(pub *sm2.PublicKey,msg []byte,sign []byte) bool {isok := pub.Verify(msg, sign)if !isok {return false}return true
}
基于Go调用国密SM2算法相关推荐
- 一文告诉你,国密SM2算法有多优秀
可能很多人都想不到,密码技术是与核技术.航天技术并列的国家三大安全核心技术之一,在保障信息安全,建设行业网络安全环境,增强我国行业信息系统的"安全可控"能力等方面发挥着至为关键的作 ...
- 国密SM2算法与RSA算法对比分析
SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在安全性能.速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法.国家密码管理局于2010年12月17日发 ...
- 国密SM2算法的只求理解不求甚解 (4/5)SM2算法加解密协议
国密SM2算法的只求理解不求甚解 (1/5)前置数学知识:模运算 国密SM2算法的只求理解不求甚解 (2/5)前置数学知识:平面几何 国密SM2算法的只求理解不求甚解 (3/5)SM2算法数学模型 国 ...
- 国密SM2算法(JS加密,C#、Java解密)
常见的渗透测试会将网站登录时密码使用明文传输视为风险.推荐使用国密算法或者RSA算法对密码进行加密传输. RSA加密(JS加密,C#.Java解密)请参考<RSA对称加密(JS加密,C#.Jav ...
- 国密SM2算法密钥派生函数KDF的实现
前段时间需要实现国密算法SM2的签名.验签.加密.解密等功能,加解密过程使用到的密钥派生函数(KDF),从网上搜到的代码不符合<GMT 0003.4-2012 SM2椭圆曲线公钥密码算法 > ...
- PBOC3.0中使用的国密SM2算法
一.知识准备 PBOC3.0规范就是<中国金融集成电路(IC)卡规范>3.0版本. SM2是国密局推出的一种他们自己说具有自主知识产权的非对称商用密码算法.本身是基于ECC椭圆曲线算法的, ...
- 谈谈PBOC3.0中使用的国密SM2算法
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 一 知识准备 SM2是国密局推出的一种他们自己说具有自主 ...
- 国密SM2算法的java和nodejs实现
转至 http://mp.weixin.qq.com/s/nboZAvg1qYiJIEun6yF2aQ 国密即国家密码局认定的国产密码算法,即商用密码.包括对称加密(SM1) ,非对称加密(SM2) ...
- mysql国密算法_【国密SM2算法】通过公钥证书获取JAVA对象
网上关于国密算法的资料较单一,大部分代码都是写的怎么通过java代码生成公私钥串. 实际项目中对方已经给了他们的公钥证书,这里记录如何通过代码解析获得Ecpoint对象并输出 关键代码 String ...
- 国密SM2算法加解密文件
对文档进行加密操作,只有经过系统解密后才能进行查看文档内容 这里使用hutool工具类提供的SM2方法,首先引入pom.xml依赖 hutool文档地址 <!--工具类--> <de ...
最新文章
- 2022-2028年中国FEP薄膜行业市场发展规模及市场分析预测报告
- Java项目:农资采购销售系统(java+SSM+Easyui+maven+Mysql)
- 重庆南岸召开总结会,今年将引进30家车联网企业
- nero 8 简体中文版能生成真正能用的序列号的注册机
- 萌新的九宫棋(C语言)
- 开源性能测试工具JMeter快速入门(一)
- php 正则mysql语句_MySQL正则表达式搜索 - mysql数据库栏目 - 自学php
- 功败垂成的王安石是大宋最后的体面
- Autofac在Asp.net MVC中在 Areas拆分到不同DLL下的注入失败问题
- IMail邮件服务-1
- opencv笔记(6):彩色图像直方图
- javascript 跳转页面写法
- Tableau可视化学习笔记:day13-14
- 26. Remove Duplicates from Sorted Array【easy】
- 【Spark笔记】Windows10 本地搭建单机版Spark开发环境
- java读取中文_java读写中文文件
- Ubuntu16.04 下安装运行 rovio-slam
- 2021最常见的网络原理面试题【好文收藏】
- 怎么样开启移动热点?看我操作,简单开启
- flink SQL与hbase整合
热门文章
- Java网络编程(9)NIO - 群聊系统
- css常用样式大全集锦
- 去掉桌面计算机快捷方式,电脑小技巧!去掉桌面快捷方式小箭头图标
- 2015 2020 r4烧录卡 区别_每分时长来看2010年与2015年与2020年澳网男单决赛的区别...
- c语言5的阶乘流程图_求n流程图(求n的阶乘的算法框图)
- 【记得交作业】波波离散实验报告一(python实现)
- # 融云 SDK 新用户入群加载历史消息 记录融云 SDK 的一个小功能,分享一下 ## 背景 项目中有用到融云 SDK 中的群组功能,产品说需要新人入群的时候看到历史消息。 本来以为直接能获
- CISSP考试复习经历分享2020年12月
- 设计类-Gliffy Diagram的安装使用
- 全国各地将推广电子证照,取代一证通