何为secp256k1 说说Filecoin 的椭圆曲线算法

Filecoin 的椭圆曲线算法 secp256k1Filecoin 的基本密码学算法与比特币一致,都是 Secp256k1。椭圆曲线算法有很多种,而且在比特币诞生之后,也有很多对椭圆曲线算法的研究

?Filecoin 的椭圆曲线算法 secp256k1

Filecoin 的基本密码学算法与比特币一致,都是 Secp256k1。椭圆曲线算法有很多种,而且在比特币诞生之后,也有很多对椭圆曲线算法的研究,和新的算法的推出,其中不乏宣称性能和安全性都高于secp256k1的算法。

尽管如此,Filecoin仍然选择此算法,一个很重要的原因是这个算法已经被广泛采用,久经考验。这种思虑在安全领域,尤其是加密学领域非常重要,算法的弱点是在使用中发现的,一个没有被广泛使用的算法,很难被证明是安全的。

?

secp256k1 定义了一个很大的有限域,大小接近于 2^256。形象的说,与宇宙中的所有原子的个数是一个级别。但无论有多大,仍然是一个有限域,即个数是固定的;

?

secp256k1 所定义的有限域在乘法下构成一个循环群,也就是说,任意选择一个数,乘以另一个数,不停地乘下去,会形成一个循环往复的效果。简单想一下模乘就可以理解了;

?

这个域中有一些神奇的元素(g),通过自身相加(或者相乘,看定义而定),也就是g, 2g, 3g, ... (g, g^2, g^3, ...,), 一直加(乘)下去,可以遍历整个域。

?

我们举另一个例子来帮助理解,比如如下有限集合:{0,1,2,3,4,5,6},在其上定义我们熟知的加减乘除 mod 7 的运算。

?

007HmOkuly4gb57p8eyg8j30ao0be0su.jpg

但是,椭圆曲线所定义的有限域中的元素实际上是椭圆曲线上的一系列点(x, y)。另外,需要注意的是前面第三点我们讲到的神奇元素,我们称为基点,一般表示为 G。

secp256k1 如何加解密?

?

椭圆曲线加解密体系是双密钥体系。也就是说每一方都有一对密钥:公钥和私钥。公钥是公开的,任何人都可以知道,私钥必须保密,否则一切都可能泄漏。

?

选定了secp256k1作为我们的椭圆曲线算法,意味着使用的参数固定了,其中一个参数基点G,这在我们系统中是一个常数。

?

G = 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8 (非压缩形式)

?

G = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 (压缩形式,仅包括X的值,Y值可以通过X计算出来)

?

基于此,就可以构建公私钥了。设私钥是?k (一个小于p的随机数),那么公钥 K = kG?,就是一个乘法。

?

加解密的过程可以简单理解为:加密者获取解密者的公钥,用其公钥加密内容,解密者拥有私钥,使用私钥解密。

?

使用公钥加密:

已知要加密的内容为:M (一个数,加密的内容当然不一定是一个数,但是转换一下就是了)。加密步骤如下:

选择随机数?r (r 同样是小于p的一个数)

计算?C = {rG, M+rK},其中G为基点,M为加密的内容,K为公钥

?

这里的C就是加密好的密文。看看,就是最简单的数学运算。这里根据公钥的定义,C也可以写成:{rG, M+rkG}。特别注意的是,这里的?r 是保密的。

?

使用私钥解密:

?

前述密文包含两个部分,分别是?rG, M+rK。

?

解密很简单,直接做如下计算,使用密文的第二部分减去第一部分乘以公钥,因?K=kG,则:

?

M+rK - k(rG) = M + rkG - krG = M (运算满足结合律)

?

简单解出原文。

?

但是,尽管看起来如此简单,无论是比特币还是Filecoin都没有使用secp256k1来加解密,而是仅仅用其来做签名。原因来自两个方面,一个方面是基本不需要,另一个方面是,非对称密钥的加解密计算复杂度太高。对少量内容可行,对大量内容则太耗费资源。

?

少量内容的加密的最广泛的应用就是签名。

secp256k1 如何签名?

?

签名,就是对内容的hash值进行加密,但加密的方向与前文描述的是相反的。也即是用私钥加密,用公钥解密。注意,这在双密钥体系中两个方向都是没有问题的。

?

已知:?公钥?K = kG。k 为私钥,G为基点。

如何求HASH值这里不赘述,总之,知道任何内容都可以求出一个固定长度的一小段信息就好了。

?

签名(使用私钥加密):

已知要签名的内容为M。签名步骤如下:

求?内容的?hash 值 h = H(M) ; H 为hash函数

选择随机数?r (r 同样是小于p的一个数),计算 rG;G(x, y)为基点

计算?s = (h + kx) / r; x 为G的横坐标

将消息?M,和签名 {rG, s} 发送给对方,或传送至链上

?

验签(使用公钥解密):

?

接收方或验证方收到消息?M,及签名 {rG, s}后。解签步骤如下:

?

求?内容的?hash 值 h = H(M) ; H 为hash函数

使用发送方公钥?K 计算 hG/s + xK/s == rG;相等即成功

?

原理如下:

hG/s + xK/s = hG/s + x(kG)/s

= (h+xk)G/s

= r(h+xk)G / (h+kx)

= rG

?

?

注:椭圆曲线算法的签名统称为?ECDSA,其签名和解签的方式不止一种,但基本的计算方式一样。完全可以按照四则运算和高中数学知识进行理解。基本理论相同。???

阅读全文

免责申明:我们致力于保护作者版权,转载或引用仅为传播更多信息之目的,部分源自互联网,无法核实真实出处,如涉及侵权,请联系我们删除,谢谢!

© Copyright 2010-2020 四零四文学网 All Rights Reserved.

四零四文学网 - 有趣儿的文学知识网

河南麻将游戏下载 北京时时彩 口碑最好的股票配资平台 陕西快乐10分 大赢家即时比分 短线股票推荐低价 浙江6+1 股票涨跌的影响 浙江6+1 3d开机号 汇盈盘 福建十一选五 新牛人配资 甘肃11选5 尚鹏配资 股票融资融券操作方法 福建11选5