椭圆曲线签名
椭圆曲线签名算法
【椭圆曲线签名】椭圆曲线依赖的数学依赖的问题:k为正整数,G是椭圆曲线上的点(称为基点),k*G = Q,已知G跟Q很难算出k
实现步骤
- 产生私钥:根据随机数产生私钥
- 对明文进行Hash摘要,由私钥,Hash摘要进行椭圆曲线签名得到两个大数r跟s,r跟s转换为字节数组拼接的结果就是签名
- 将消息明文Msg,与签名发送给接收方
- 当接受方接收到数据时从签名中提取出r和s
- 对明文进行Hash摘要后与公钥和r和s进行验证
func main() {
msg := "hello World"
//通过椭圆曲线产生私钥
privateKey,_ := ecdsa.GenerateKey(elliptic.P256(),rand.Reader)
//通过私钥产生公钥
publicKey := privateKey.PublicKey//对明文进行加密
data_hash := sha256.Sum256([]byte(msg))
r,s,err := ecdsa.Sign(rand.Reader,privateKey,data_hash[:])
if err != nil {
log.Panic(err)
}signature := append(r.Bytes(),s.Bytes()...)//对签名进行验证
r1 := big.Int{}
s1 := big.Int{}siglen := len(signature)
r1.SetBytes(signature[:(siglen/2)])
s1.SetBytes(signature[(siglen/2):])isVerify := ecdsa.Verify(&publicKey,data_hash[:],&r1,&s1)
if isVerify {
fmt.Println("验证通过")
}
}
推荐阅读
- 贝塞尔曲线
- vue项目+wxjssdk,config配置解决iPhone端签名错误的问题
- 椭圆参数的推导过程
- 高中数学,圆锥曲线怎么学(来偷看一下学霸的方法!教你快速掌握。)
- 你的名字,还可以这样写(——第17批个性艺术签名新鲜出炉啦~)
- 数字签名是什么(转自阮一峰的博客)
- 26(需求曲线和边际收益的关系)
- Java接口签名(Signature)实现方案
- 基于React实现的PDF在线预览-签名-导出
- CSS揭秘(特殊形状绘制自适应椭圆、梯形和平行四边形)