区块链密码学之非对称加密

前言

加密算法可分为2大类:对称加密和非对称加密。如下图所示:

区块链密码学之非对称加密_第1张图片

椭圆曲线密码体制(Elliptic Curve Cryptosystem,ECC)在同等密钥长度的情况下安全强度要远高于RSA体制等其他密码体制,因而ECC在网络信息安全领域有着非常重要的理论研究价值和广阔的实际应用前景。另一方面,在安全性相当的情况下,ECC所使用的密钥长度更短,这也就意味着对于带宽和存储空间的需求相对较小,并且到目前为止,还没有出现针对椭圆曲线的亚指数时间算法。因此,ECC将会是今后最重要的主流公钥加密技术。

现在绝大多数区块链的非对称加密算法都是椭圆曲线系列算法,其中的secp256k1椭圆曲线更是被青睐。比特币、以太坊、EOS等都是采用的secp256k1,可见secp256k1的火热,究其原因,secp256k1的常数以可以预测的方法选择,可以有效避免后门出现的可能性。

secp256k1椭圆曲线

具体算法描述和原理,反正我是没看懂,也就不描述了。感兴趣的可以去研究下,比较复杂。下面从源码使用角度来说明比特币的secp256k1算法,看看如何从私钥得到公钥,如何签名,再到最后如何验证。

首先是私钥,私钥怎么得到?私钥其实就是一个随机选出的数字而已。长度为32个字节,256bit。一般使用密码学安全的随机数生成器得到一长串数字,对这串数字hash256 后 就可以得到一个 256bit的私钥。源码体验为了简单,就随便写了32字节的私钥。。。源码地址为:https://github.com/1261385937/key

区块链密码学之非对称加密_第2张图片

首先创建secp256k1_context_sign ,然后将一个32字节的随机种子传递到上下文中。这个32字节的随机种子也是我随便写的。secret_key 就是神秘的私钥了。

区块链密码学之非对称加密_第3张图片

上面就是在创建公钥了,可以看出是利用私钥创建的。public_key是为了保存Serialize的公钥。public_key可选择压缩还是非压缩,长度不一样。

区块链密码学之非对称加密_第4张图片

同样的,上面的private_key 是为了保存Serialize的私钥,同样可以选择压缩和非压缩。我都是按照比特币默认压缩选择的。看完了公钥和私钥,下面看看如何用私钥签名:

区块链密码学之非对称加密_第5张图片

msg_hash通常是一笔交易的摘要,即 对交易进行hash256。这里是我随便写的,长度32字节。然后利用私钥secret_key进行签名。最后按照DER format Serialize 签名,数据放入vchSig。

那么如何对这个签名校验呢?下面看看利用公钥如何校验这个签名:

区块链密码学之非对称加密_第6张图片

显示创建secp256k1_context_verify,和上面的secp256k1_context_sign 是有区别的,前者是签名上下文,后者是校验上下文。从public_key 解析出公钥pubkey299,可见比特币并不是直接使用“原生”公钥。然后再从vchSig中解析出签名sig300。    secp256k1_ecdsa_signature_normalize函数把sig300变成 lower-S format 。最后一行用公钥校验签名。如果校验成功 ,则ok值为1,否则为0。

至此整个非对称加密secp256k1核心 API 介绍完毕。比特币把核心API直接封装在CKey 和CPubKey2个类中,不利于看清整个脉络。

总结

”私钥签名,公钥校验。公钥加密,私钥解密“。私钥是不公开的,所以用私钥签名意味着 我对这个”东西“的所有权。在区块链世界 签名代表着 个人为此次交易的背书。

你可能感兴趣的:(区块链)