简介
椭圆曲线密码学(英语:Elliptic curve cryptography,缩写为 ECC),一种建立公开密钥加密的算法,基于椭圆曲线数学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。

ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。

椭圆曲线密码学的许多形式有稍微的不同,所有的都依赖于被广泛承认的解决椭圆曲线离散对数问题的困难性上.

数学原理
不管是RSA还是ECC或者其它,公钥加密算法都是依赖于某个正向计算很简单(多项式时间复杂度),而逆向计算很难(指数级时间复杂度)的数学问题。

椭圆曲线依赖的数学难题是:

k为正整数,P是椭圆曲线上的点(称为基点), k*P=Q , 已知q和P,很难计算出k
密钥生成
golang 标准包中直接提供了密钥生成的方法

// 初始化椭圆曲线
pubkeyCurve := elliptic.P256()
// 随机挑选基点,生成私钥
p, err := ecdsa.GenerateKey(pubkeyCurve, rand.Reader)
if err != nil {fmt.Println("1", err)os.Exit(1)
}
PRIVATE = p

加密和解密
golang标准包中没有提供加密和解密算法,但是以太坊go-ethereum实现了相关算法,这里对其进行二次封装

// 将标准包生成私钥转化为ecies私钥
prv2 = ecies.ImportECDSA(PRIVATE)
// ecc(ecies)加密
func ECCEncrypt(pt []byte) ([]byte, error) {ct, err := ecies.Encrypt(rand.Reader, &prv2.PublicKey, pt, nil, nil)return ct, err
}
// ecc(ecies)解密
func ECCDecrypt(ct []byte) ([]byte, error) {pt, err := prv2.Decrypt(ct, nil, nil)return pt, err
}

签名和验签
golang标准包中提供了相关方法

func EccSign(pt []byte) (sign []byte, err error) {// 根据明文plaintext和私钥,生成两个big.Ingr, s, err := ecdsa.Sign(rand.Reader, PRIVATE, pt)if err != nil {fmt.Println(err)return nil, err}rs, err := r.MarshalText()if err != nil {return nil, err}ss, err := s.MarshalText()if err != nil {return nil, err}// 将r,s合并(以“+”分割),作为签名返回var b bytes.Bufferb.Write(rs)b.Write([]byte(`+`))b.Write(ss)return b.Bytes(), nil
}func EccSignVer(pt, sign []byte) bool {var rint, sint big.Int// 根据sign,解析出r,srs := bytes.Split(sign, []byte("+"))rint.UnmarshalText(rs[0])sint.UnmarshalText(rs[1])// 根据公钥,明文,r,s验证签名v := ecdsa.Verify(&PRIVATE.PublicKey, pt, &rint, &sint)return v
}

ECC,ECIES,ECDSA,ECDH 是什么关系,有哪些区别?
ECC,全称椭圆曲线密码学(英语:Elliptic curve cryptography,缩写为 ECC),主要是指相关数学原理
ECIES,在ECC原理的基础上实现的一种公钥加密方法,和RSA类似
ECDSA,在ECC原理上实现的签名方法
ECDH在ECC和DH的基础上实现的密钥交换算法
RSA算法的密钥对可以通过.pem文件来保存,ECC的密钥对要如何保存呢?
go-ethereum提供了两种对外接口.

密钥对和[]byte之间的转换

// 私钥 -> []byte
// FromECDSA exports a private key into a binary dump.
func FromECDSA(priv *ecdsa.PrivateKey) []byte {if priv == nil {return nil}return math.PaddedBigBytes(priv.D, priv.Params().BitSize/8)
}// []byte -> 私钥
// ToECDSA creates a private key with the given D value.
func ToECDSA(d []byte) (*ecdsa.PrivateKey, error) {return toECDSA(d, true)
}// 公钥 -> []byte
func FromECDSAPub(pub *ecdsa.PublicKey) []byte {if pub == nil || pub.X == nil || pub.Y == nil {return nil}return elliptic.Marshal(S256(), pub.X, pub.Y)
}// []byte -> 公钥func ToECDSAPub(pub []byte) *ecdsa.PublicKey {if len(pub) == 0 {return nil}x, y := elliptic.Unmarshal(S256(), pub)return &ecdsa.PublicKey{Curve: S256(), X: x, Y: y}
}

公钥转换的时候需要注意,eth中默认使用的椭圆曲线是S256().生成密钥对时,如果使用的是其他椭圆曲线(如P256),需要对FromECDSAPub,ToECDSAPub稍作修改

密钥对和文件之间的转换,其实就是在中间加一层hex编码

// 私钥 -> 文件
// SaveECDSA saves a secp256k1 private key to the given file with
// restrictive permissions. The key data is saved hex-encoded.
func SaveECDSA(file string, key *ecdsa.PrivateKey) error {k := hex.EncodeToString(FromECDSA(key))return ioutil.WriteFile(file, []byte(k), 0600)
}// 文件 -> 私钥
func LoadECDSA(file string) (*ecdsa.PrivateKey, error) {buf := make([]byte, 64)fd, err := os.Open(file)if err != nil {return nil, err}defer fd.Close()if _, err := io.ReadFull(fd, buf); err != nil {return nil, err}key, err := hex.DecodeString(string(buf))if err != nil {return nil, err}return ToECDSA(key)
}

golang中椭圆曲线密码相关推荐

  1. ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学

    ECC ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学,是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制.在软件注册保护方面起到很大的作用,一般的序列 ...

  2. 椭圆曲线密码算术(ECC)原理

    引言 大多数使用公钥密码进行加密和数字签名的产品都使用的是RSA算法.为了保证RSA的安全性,密钥的位数一定会增加,这对使用RSA的应用有着很重的负担. 而椭圆曲线密码(elliptic curve ...

  3. 7.6椭圆曲线密码算法

    1.椭圆曲线密码算法 为了保证RSA算法的安全性,其密钥长度不断增加,导致加解密运算负担越来越重,处理速度越来越慢:相比之下,基于椭圆曲线理论的公钥密码体制可以用较短的密钥获得同样的密码强度. 1.椭 ...

  4. 【密码学-2】什么是椭圆曲线密码

    文章目录 前言 一.椭圆曲线是什么? 二.ECC加密算法 1.简化的加密过程 2.数学相关知识 总结 本文共2042字,阅读全文约需10分钟. 前言 上回书我们说到,在常见的三种公钥密码学算法中,椭圆 ...

  5. ECC(椭圆曲线密码编码学)简介

    参考:ECC加密算法入门介绍 ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)属于公开密钥算法. 一.平行线 假设平行线相交于无穷远点P∞,那么所有直线都相交,且 ...

  6. 椭圆曲线密码算法概述

    椭圆曲线密码算法 椭圆曲线密码算法(Elliptic Curve Cryptography,ECC)是基于椭圆曲线数学的一种公钥密码算法,其安全性依赖于椭圆曲线离散对数问题的困难性. 椭圆曲线密码算法 ...

  7. Golang中备份MYSQL数据库

    请注明出处:https://blog.csdn.net/qq_23179075/article/details/83306104 Golang中备份MYSQL数据库 package mainimpor ...

  8. golang中连接mongo数据库并进行操作

    golang中连接mongo数据库并进行操作 golang中连接mongo数据库并进行操作 首先,我们需要下载mongo模块 执行 go get github.com/mongodb/mongo-go ...

  9. golang中base64 md5 sha256的编解码及摘要算法、aes、des、sha1

    golang中base64 md5 sha256的编解码及摘要算法.aes.rsa.des.sha1 golang中base64 md5 sha256的编解码及摘要算法 关于加密解密 AES DES ...

最新文章

  1. CGIC简明教程(转摘)
  2. html中如何修改href,在html中设置href链接中的变量
  3. 用树莓派做一个alibaba-guest
  4. Aspose.Cells小实例
  5. python和c哪个好学-C/C++和Python哪个更有前景?
  6. java Io流实现图片复制
  7. 全国计算机二级vb 无纸化,2013年3月全国计算机等级考试二级VB无纸化上机题题库题干及答案解析(2)...
  8. mysql 5.6密钥_MySQL的密钥文件不正确
  9. C++转换构造函数和类型转换函数
  10. string类的常用函数
  11. Spring 方法注入
  12. HttpWebRequest中GetResponse或者说GetRequestStream偶尔超时,或者是各种操作超时造成的假死的一些解决方案...
  13. java adf是什么_在ArcIMS9.2中使用JAVA ADF实现图层要素的查询
  14. 使用Cargo入门rust语言
  15. Bibles_Numpy离线文档
  16. Java:QQ登录页面的制作(实现成功登录的代码)——含源码
  17. python风格迁移_Python简单实现图像风格迁移
  18. SecureCRT绿色破解版(解压即可,无注册机)
  19. stm32 驱动步进电机
  20. 我奋斗了十八年不是为了和你喝一杯咖啡

热门文章

  1. 我终于知道上哪里给男朋友买礼物了,姐妹们毒APP用起来
  2. 《脑机接口导论》学习笔记 3.记录大脑的信号和刺激大脑
  3. Hexo-Theme-Sakura 实践记录
  4. 【Red Hat7创建/扩容/删除逻辑卷 #步骤非常非常详细】
  5. 分数化小数计算机在线,循环小数化分数计算器
  6. ECCV 2022 | 超越MobileViT!EdgeFormer:学习ViT来改进轻量级卷积网络
  7. 不建议轻易做量化玩高频
  8. 若依微服务版登录流程源码分析1
  9. 暴多的教学视频,想要的就快下!
  10. JMeter 图片上传接口进行压力测试