比特币学习1-椭圆曲线算法理解

对称加密算法和非对称加密算法简介

原文地址:https://blog.csdn.net/yonggao023/article/details/80173950
作者:梦幻艾斯
备注:欢迎转载,请保留原文地址。

常用的加密算法可以分为对称加密和非对称加密。为什么会有两种算法呢?一种不能满足需求吗?

对称加密算法

对称算法在加密和解密过程中使用的密钥都是相同的,举个简单的例子:
我们使用最简单的对称算法–异或算法来模拟用户A向用户B发送加密信息的流程
假设m1是明文,k是密钥.m1异或k得到密文m2
1. A 将m2和k传给B;
2. B收到m2和k后进行异或操作获得明文m1

信息窃听问题:A和B是通过网络传输的,中间传输的数据可能会被其它人截获。由于异或算法是公开的,所以截获者很容易就能得到明文m1
为了解决这个密钥传输问题,牛人们发明了非对称算法

非对称加密算法

在对称算法中使用的加密密钥和解密密钥是相同的。但是在非对称加密算法中加密的密钥和解密的密钥是不一样的。通常我们把加密密钥称为公钥(可以公开给别人),把解密密钥称为私钥。公钥加密的数据只有私钥才能解密。还是用上面的例子来模拟非对称加密传输流程:
1. A通过密钥生成算法生成公钥、私钥。
2. A将公钥发送给B
3. B用公钥将m1加密成密文m2
4. B将m2发送给A
5. A使用私钥解密m2得到m1

信息窃听问题:在这个过程中A和B传输的只有密文和公钥,由于密文只有私钥才能解密,所以即使有人截获信息也无法得到密文。
那么问题来了,A怎么将加密信息传输给B呢?

在RSA算法中私钥和公钥是可以互换的,即可以用公钥加密、私钥解密也可以用私钥加密、公钥解密。但是在其它非对称算法是不行的,比如椭圆曲线算法(反正我没找到椭圆曲线算法私钥加密的公式,谁找到了欢迎打脸)。虽然RSA可以互换但是还是要保持用公钥加密、私钥解密的方案。具体原因请看这篇文章
现在来回答A怎么将加密信息传输给B。
其实很简单,B生成一对公钥私钥,然后把公钥发给A。A用B的公钥对数据进行加密然后发送给B。B用自己的私钥解密。
这里我们得出一个结论:
非对称加密算法是为了解决对称算法
传输过程中被破解的问题
传输过程中被破解的问题
传输过程中被破解的问题

非对称加密算法特性(个人愚见,没有被大牛论证过)

  1. 都是在有限域里面取值,所以为了值不溢出都会有取模操作
  2. 一般的非对称算法体系都会包含3个算法

    1. 密钥生成算法(生成公钥、私钥)
    2. 加密解密算法(公钥加密、私钥解密)
    3. 签名算法(私钥签名、公钥验证)
  3. 破解难度都是基于一个数学问题的破解,比如rsa的大质数分解问题、椭圆曲线算法曲线上离散对数求解难的问题。

椭圆曲线算法也具备上述特性

椭圆曲线算法简介

我们根据上面非对称加密算法特性来简单介绍下椭圆曲线算法

椭圆曲线取值的域

通常能用来进行加密运算的椭圆曲线的公式是长这样的:

$y^2 = x^3 +ax + b$

image
椭圆曲线取值的域就是线上的点。
密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:
T=(p,a,b,G,n,h)。
(p 、a 、b 用来确定一条椭圆曲线,
G为基点,
n为点G的阶–nG等于无穷远点,
h 是椭圆曲线上所有点的个数m与n相除的整数部分)

比特币椭圆曲线的取值可以看这里

密钥生成算法

生成公式是K=kG,大写的K是公钥也是曲线上的一个点,小写的k是私钥,G是上面定义的曲线的基点。
kG = (G+G+G….+G)即k个G相加
这里简单介绍下椭圆曲线上的加法
我们习惯了有理数的方法1+1=2,但是不是所有的东西都是有理数。学过c++的同学应该都重写过类的加法操作,大家可以理解为椭圆曲线上的加法被重写了,它的规则和有理数的加法不一样。

//椭圆曲线的加法像这样
Point operator+(const Point& a, const Point& b)
    {
        //a 和b各种操作后返回了一个poin c
        return c;
    }

具体的加法规则是
任意取椭圆曲线上两点P、Q (若P、Q两点重合,则做P点的切线)做直线交于椭圆曲线的另一点R’,过R’做y轴的平行线交于R。我们规定P+Q=R
image
image
从上面的加法规则中可以得出公钥K就是在曲线上折来折去得到的点。
密钥生成的过程我们可以开个脑洞,想象一下一个桌球台。有一个固定的点G。把桌球放到G点上,每次用球杆撞击球的方向是相同的。我们用不同的力度去撞击球。最后球会静止在桌球上的某一个点。这个点就是我们的公钥K,我们撞击的力度就是私钥k。当你知道G点和力度的时候很容易把球撞到公钥K的点。但是你知道公钥K的点和G点,你很难算出到底使用多大力度进行撞击。这就是椭圆曲线算法的破解难度。

加密解密算法

现在我们描述一个利用椭圆曲线进行加密通信的过程:
1. 双方约定好一条加密的椭圆曲线Ep(a,b),或者A选择一条椭圆曲线然后将参数传给B
2. 用户A选择一个私有密钥k,并生成公开密钥K=kG。
3. 用户A公钥K传给B
4. 用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M(编码方法很多,这里不作讨论),并产生一个随机整数r(r < n)
5. 用户B计算点C1=M+rK;C2=rG。
6. 用户B将C1、C2传给用户A。
7. 用户A接到信息后,计算C1-kC2,结果就是点M。因为
C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M
再对点M进行解码就可以得到明文。

签名验证算法

签名流程
1. 双方约定好一条加密的椭圆曲线Ep(a,b),或者A选择一条椭圆曲线然后将参数传给B
2. 用户A选择一个私有密钥k,并生成公开密钥K=kG。
3. 生成随机数r,使得s1=rG(x,y)
4. 设消息M的哈希为h,得到s2=(h+xk)/r
5. A将M、s1、s2、公钥K传给B
6. B算出M的哈希h
7. B判断hG/s2 + xK/s2是否等于s1
8. 公式推导:hG/s2 + xK/s2=hG+xK/s2=(hG+xK)*r/(h+xk)=(hG+xkG)*r/(h+xk)=(h+xk)*Gr/(h+xk)=rG

全文完
参考资料:
精通比特币
ECC加密算法入门介绍
椭圆曲线加解密及签名算法的技术原理及其Go语言实现

猜你喜欢

转载自blog.csdn.net/yonggao023/article/details/80173950