SM2椭圆曲线公钥密码算法本身是基于ECC椭圆曲线算法的,所以要搞sm2, 先要弄懂ECC。
这里学习ECC椭圆曲线算法,主要参考了一位前辈的技术博客,网名为ZMWorm 的大牛在多年前写的《椭圆曲线ECC加密算法入门介绍》。
在此特别注明出处:
作者 :ZMWorm[CCG]
E-Mail:zmworm@sohu.com
主页 :Http://ZMWorm.Yeah.Net/
-----------------------------------------------------分割线、以下是正文----------------------------------------------------
前言
同RSA(Ron Rivest,Adi Shamir,Len Adleman三位天才的名字)一样,ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)也属于公开密钥算法。目前,国内详细介绍ECC的公开文献并不多(反正我没有找到)。有一些简介,也是泛泛而谈,看完后依然理解不了ECC的实质(可能我理解力太差)。前些天我从国外网站找到些材料,看完后对ECC似乎懵懂了。于是我想把我对ECC的认识整理一下,与大家分享。当然ECC博大精深,我的认识还很肤浅,文章中错误一定不少,欢迎各路高手批评指正,小弟我洗耳恭听,并及时改正。文章将采用连载的方式,我写好一点就贴出来一点。本文主要侧重理论,代码实现暂不涉及。这就要求你要有一点数学功底。最好你能理解RSA算法,对公开密钥算法有一个了解。《近世代数基础》《初等数论》之类的书,最好您先翻一下,这对您理解本文是有帮助的。别怕,我尽量会把语言通俗些,希望本文能成为学习ECC的敲门砖。
一、从平行线谈起。
平行线,永不相交。没有人怀疑把。不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了?事实上没有人见到过。所以“平行线,永不相交”只是假设(大家想想初中学习的平行公理,是没有证明的)。既然可以假设平行线永不相交,也可以假设平行线在很远很远的地方相交了。即平行线相交于无穷远点P∞(请大家闭上眼睛,想象一下那个无穷远点P∞,P∞是不是很虚幻,其实与其说数学锻炼人的抽象能力,还不如说是锻炼人的想象力)。给个图帮助理解一下:
直线上出现P∞点,所带来的好处是所有的直线都相交了,且只有一个交点。这就把直线的平行与相交统一了。为与无穷远点相区别把原来平面上的点叫做平常点。
以下是无穷远点的几个性质。
▲直线L上的无穷远点只能有一个。
(从定义可直接得出)
▲平面上一组相互平行的直线有公共的无穷远点。
(从定义可直接得出)
▲ 平面上任何相交的两直线L1,L2有不同的无穷远点。
(否则L1和L2有公共的无穷远点P ,则L1和L2有两个交点A、P,故假设错误。)
▲平面上全体无穷远点构成一条无穷远直线。(自己想象一下这条直线吧)
▲平面上全体无穷远点与全体平常点构成射影平面。
我的补充:
无穷远点:射影几何中直线只有有一个无穷远点就是无穷远点,直线的两端交于无穷远点(可把直线看作封闭曲线),.两条平行的直线可以看作相交在无穷远点,所有的平行直线都交于同一个无穷远点。
无穷远直线:无穷远直线亦称假直线或理想直线.指欧氏平面上的一条假想直线,它是平面上所有直线上的无穷远点的集合.为了区别起见,平面内原有的直线称为有穷直线、真直线或普通直线.在平面上引进无穷远直线以后,空间中每两个平面都有交线一组平行的平面相交于属于诸平行平面的一条无穷远直线。
射影平面:2维射影空间。它可以视为平面添上一条无穷远直线, 它是代数几何、射影几何里最基本的对象。
二、射影平面坐标系
射影平面坐标系是对普通平面直角坐标系(就是我们初中学到的那个笛卡儿平面直角坐标系)的扩展。我们知道普通平面直角坐标系没有为无穷远点设计坐标,不能表示无穷远点。为了表示无穷远点,产生了射影平面坐标系,当然射影平面坐标系同样能很好的表示旧有的平常点(数学也是“向下兼容”的)。
我们对普通平面直角坐标系上的点A的坐标(x,y)做如下改造:
令x=X/Z ,y=Y/Z(Z≠0);则A点可以表示为(X:Y:Z)。
变成了有三个参量的坐标点,这就对平面上的点建立了一个新的坐标体系。
例2.1:求点(1,2)在新的坐标体系下的坐标。
解:∵X/Z=1 ,Y/Z=2(Z≠0)∴X=Z,Y=2Z ∴坐标为(Z:2Z:Z),Z≠0。即(1:2:1)(2:4:2)(1.2:2.4:1.2)等形如(Z:2Z:Z),Z≠0的坐标,都是(1,2)在新的坐标体系下的坐标。
我们也可以得到直线的方程aX+bY+cZ=0(想想为什么?提示:普通平面直角坐标系下直线一般方程是ax+by+c=0)。新的坐标体系能够表示无穷远点么?那要让我们先想想无穷远点在哪里。根据上一节的知识,我们知道无穷远点是两条平行直线的交点。那么,如何求两条直线的交点坐标?这是初中的知识,就是将两条直线对应的方程联立求解。平行直线的方程是:aX+bY+c1Z =0; aX+bY+c2Z =0 (c1≠c2);(为什么?提示:可以从斜率考虑,因为平行线斜率相同)。