上一篇文章介绍了私钥的生成过程,私钥本质上是随机生成的。公钥是在私钥的基础上通过算法生成的。 私钥可以推出公钥,但无法从公钥推出私钥。 非对称加密 密码学中的加密方法主要有对称加密(Symmetric-key algorithm)和非对称加密(Asymmetric-key cryptography)。 对称加密:加、解密使用相同的密钥,只有一个密钥作为私钥;非对称加密:加、解密使用不同的密钥,私钥加密、公钥解密,或者公钥加密、私钥解密。比特币和EOS的公私加密算法就是一种非对称加密,具体使用了椭圆曲线加密算法。 椭圆曲线加密算法 公钥加密有ECC、ECDH、ECDSA等算法,第一个是椭圆曲线加密(Elliptic Curve Cryptography)的缩写,后两个算法是基于它的算法。 比特币和EOS的的公私加密算法使用的是ECDSA,全称是椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm),是使用ECC对数字签名算法(DSA)的模拟。 什么是椭圆曲线? 椭圆曲线是指满足下面公式的点集 其中a,b为实数,且4a3+27b2≠0(判别式)。 根据a,b系数取值的不同,它的函数图像大概像这样 椭圆曲线如何生成公钥? 以a=-1,b=1时的椭圆曲线方程为例
它的图像是这样的 使用椭圆曲线方程从私钥生成公钥的过程如下: 在y2=x3-x+1图像上随机选取一个点P(x,y);把私钥k与P点的坐标(x,y)分别相乘,得到(kx,ky),这个点也在椭圆曲线上;把(kx,ky)点的坐标值kx和ky拼接在一起,得到的结果就是公钥。这里的相乘是椭圆曲线乘法,私钥k和椭圆曲线上的点P相乘,相当于k个该点相加。 椭圆曲线乘法:kP = P+P+P+...+P(k次) 这里就要定义椭圆曲线的加法。 椭圆曲线加法:在椭圆曲线上取一点P(Xp,Yp),再取一点Q(Xq,Yq),连接P、Q两点作一条直线,这条直线将在椭圆曲线上交于第三点R,过R点作垂直于X轴的直线,将过椭圆曲线另一点(一般是关于X轴对称的点),则该点被定义为P+Q的结果。 当P=Q时,P、Q两点的连线是曲线的一条切线,依然可以得到一个点P+Q,只是这个点比较远。 当P=Q时,P+Q=2P。 现在可以理解椭圆曲线乘法了,kP和2P只是倍数不同,kP表示重复椭圆曲线加法操作k次得到的曲线上的点,如上所述,这个点的坐标值拼接在一起就是公钥。 k是私钥,私钥本质上是一个随机的正整数,这个正整数可能是一个天文数字,即需要重复椭圆加法操作非常多次,那如何求出kP呢? 可以从P点(图上是G点)出发,不停做切线,找对称点,可以得到2P、4P、8P、16P...,这是指数级增长的,而k的最大值为2256,最多运算200多次即可求出kP。 为什么无法从公钥推出私钥? 从椭圆曲线生成公钥的算法得知,公钥只是椭圆曲线上的一个点,而这个点的来源可以有很多种,因而无法找到确切的私钥。 质数阶有限域上的椭圆曲线 椭圆曲线曲线上的点有无数个,如果选择一个很简单的点和私钥相乘,得到的公钥的安全性就会存在问题,因此对选取的起始点P(x,y)需要有一定的要求。 这个要求就是把椭圆曲线定义在质数阶有限域上,椭圆曲线上连续的点变成了离散的点。
对有限域上的离散点进行P+Q运算的原理和在连续曲线上相同,P、Q点的连线相交于第三点R,即为P+Q=R(因为是有限域,连线不会跑出边界,而是从边界对称点重复绘制)。 质数阶的大小决定了有限域的返回,这个质数越大,算出的公钥越安全。 secp256k1标准 比特币和EOS使用的椭圆曲线加密算法使用了secp256k1标准,这个标准规定具体使用那种椭圆曲线,具体规定如下: 1、系数a=0,b=7,即具体使用的椭圆曲线方程为y2=x3+7,在实数域上的图像如下(但这个图像不能用,需要质数阶有限域上的点) 2、质数阶为2256-232-29-28-27-26-24-20,用十六进制表示为 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F 3、基准点G的坐标为 (79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798, 483ADA77 26A3**65 5DA4FBFC 0E1108A8 FD17B448 A6855419 9**7D08F FB10D4B8) 未压缩格式公钥(65字节) 基准点G就是上述的起始点P,因为基准点G是固定的,使用私钥和G点相乘就可以得到公钥。 公钥 K = k*G 是椭圆曲线上的一个坐标点,G是基准点(生成点)。 未压缩公钥取点K(x,y)的坐标值加前缀0x04拼接而成: 04 360c18aab0eabbd8b6b26ca8032c693ed1aab28da6eb1d0472eabd8e21233816 f6a8b41be315205daefba5648e947bc106f254f56b1a40d6190cec7b9f40813d 公钥的坐标的x、y点都是32字节的数据,加上前缀1个字节,总共是65字节。 压缩格式公钥(33字节) 公钥是方程y2=x3+7上的一个点,知道x坐标,可以求得y坐标,因此可以只存储公钥的x坐标。 压缩格式公钥是以0x02或0x03作为前缀,y是偶数使用02作为前缀,y是奇数使用03作为前缀。 03 360c18aab0eabbd8b6b26ca8032c693ed1aab28da6eb1d0472eabd8e21233816 非对称加密原理 现在回头来看非对称加密的原理。 私钥k:随机生成,仅自己知道公钥K:k和基准点G相乘,K=k*G,对外公开基准点G是约定好的,可以看作一个常数,这个决定了K=k*G这个公式的单向函数性质 很难倒推:G是常数,知道公钥K,很难求出私钥k很好验证:G是常数,知道私钥k,很容易验证K是它的公钥这两个性质可以分别应用于数据加密传输和数字签名。 1、数据加密传输 Alice有自己的公钥(Ka)和私钥(ka),Bob有自己的公钥(Kb)和私钥(kb),公钥是对外公开的,私钥仅自己知道。 -Alice的公钥Alice的私钥Bob的公钥Bob的私钥Alice知道KakaKbBob知道KaKbkb从图表可以得出,Alice知道ka * Kb的结果,Bob知道kb * Ka的结果,即都知道自己的私钥和别人的公钥的乘积。 由K=k*G可以得出以下式子 ka * Kb = ka * kb * G kb * Ka = kb * ka * G 这两个数据是相等的,使用Alice的私钥和Bob的公钥加密的数据,可以被Bob用自己的私钥和Alice的公钥解开。 2、数字签名 假设Alice对数据m进行签名,可以用私钥ka和m相乘(群乘法),结果假设为 N = ka * m N就是签名后的数据。 其他人验证数据时使用Alice的公钥Ka和m相乘 Ka * m = ka * G * m = G * N G是常数,而ka * m = N,即Alice发布的签名后的数据,因此其他人可以在不知道m的情况下验证数据是由Alice签名的。 总结 到这里,介绍了如何通过椭圆曲线加密算法从私钥生成公钥,但这里生成的公钥和平时见到的EOS公钥有点不太一样 EOS6W8V9TguKRMWGrGKcfBPNAPSdk1asKL5QnwbFZV7fJyNMNRLN5 其实这个EOSXXX开头的公钥本质上应该叫做“EOS地址”,由于EOS增加了账户的概念,账户充当了地址的作用,这个“EOS地址”就变成了“EOS公钥”。 下一篇文章介绍如何从私钥运算出EOS公钥。 —- 编译者/作者:松果 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
EOS密码学:公钥生成原理-椭圆曲线加密算法
2020-06-10 松果 来源:区块链网络
LOADING...
相关阅读:
- 浩瀚读币:比特币晚间又创新高 牛市是否来临?2020-08-01
- 币疏影:比特币价格又创新高 八月牛市已然初现2020-08-01
- 新手如何炒虚拟货币?币圈小白炒币技巧和经验以及交易工具的使用总2020-08-01
- 古瑞:8.1早间行情分析2020-08-01
- 奕恒说币:8/1比特币旗开得胜,能否发起最后的总攻?2020-08-01