椭圆曲线ECC加密算法入门介绍 下载本文

2) k=(7-10)/(9-3)=-1/2,2的乘法逆元为12 因为2*12≡1 (mod 23)

k≡-1*12 (mod 23) 故 k=11。

x=112-3-9=109≡17 (mod 23); y=11[3-(-6)]-10=89≡20 (mod 23) 故P+Q的坐标为(17,20)

3) k=[3(32)+1]/(2*10)=1/4≡6 (mod 23)

x=62-3-3=30≡20 (mod 23)

y=6(3-7)-10=-34≡12 (mod 23)

故2P的坐标为(7,12)

最后,我们讲一下椭圆曲线上的点的阶。

如果椭圆曲线上一点P,存在最小的正整数n,使得数乘nP=O∞,则将n称为P的 阶,若n不存在,我们说P是无限阶的。

事实上,在有限域上定义的椭圆曲线上所有的点的阶n都是存在的(证明,请参考近世代数方面的书)

练习:

1. 求出E11(1,6)上所有的点。

2.已知E11(1,6)上一点G(2,7),求2G到13G所有的值。 六、椭圆曲线上简单的加密/解密

公开密钥算法总是要基于一个数学上的难题。比如RSA 依据的是:给定两个素数p、q 很容易相乘得到n,而对n进行因式分解却相对困难。那椭圆曲线上有什么难题呢?

考虑如下等式:

K=kG [其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数]

不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。

这就是椭圆曲线加密算法采用的难题。我们把点G称为基点(base point),k(k育学网-Oa,Q3{nYU1X5h

现在我们描述一个利用椭圆曲线进行加密通信的过程:

1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。

2、用户A选择一个私有密钥k,并生成公开密钥K=kG。

3、用户A将Ep(a,b)和点K,G传给用户B。

4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M(编码方法很多,这里不作讨论),并产生一个随机整数r(r

7、用户A接到信息后,计算C1-kC2,结果就是点M。因为

C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M

再对点M进行解码就可以得到明文。

在这个加密通信中,如果有一个偷窥者H ,他只能看到Ep(a,b)、K、G、C1、C2 而通过K、G 求k 或通过C2、G求r 都是相对困难的。因此,H无法得到A、B间传送的明文信息。

密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:

T=(p,a,b,G,n,h)。

(p 、a 、b 用来确定一条椭圆曲线,G为基点,n为点G的阶,h 是椭圆曲线上所有点的个数m与n相除的整数部分) 这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:

1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求; 2、p≠n×h;

3、pt≠1 (mod n),1≤t<20; 4、4a3+27b2≠0 (mod p); 5、n 为素数;

6、h≤4。

七、椭圆曲线在软件注册保护的应用

我们知道将公开密钥算法作为软件注册算法的好处是Cracker很难通过跟踪验证算法得到注册机。下面,将简介一种利用Fp(a,b)椭圆曲线进行软件注册的方法。 软件作者按如下方法制作注册机(也可称为签名过程)

1、选择一条椭圆曲线Ep(a,b),和基点G;

2、选择私有密钥k(k

3、产生一个随机整数r(r< p>

4、将用户名和点R的坐标值x,y作为参数,计算SHA(Secure Hash Algorithm 安全散列算法,类似于MD5)值,即Hash=SHA(username,x,y); 5、计算sn≡r - Hash * k (mod n)

6、将sn和Hash作为 用户名username的序列号

软件验证过程如下:(软件中存有椭圆曲线Ep(a,b),和基点G,公开密钥K) 1、从用户输入的序列号中,提取sn以及Hash;

2、计算点R≡sn*G+Hash*K ( mod p ),如果sn、Hash正确,其值等于软件作者签名过程中点R(x,y)的坐标,因为

sn≡r-Hash*k (mod n)

所以

sn*G + Hash*K

=(r-Hash*k)*G+Hash*K

=rG-Hash*kG+Hash*K =rG- Hash*K+ Hash*K

=rG=R ;

3、将用户名和点R的坐标值x,y作为参数,计算H=SHA(username,x,y);

4、如果H=Hash 则注册成功。如果H≠Hash ,则注册失败(为什么?提示注意点R与Hash的关联性)。

简单对比一下两个过程:

作者签名用到了:椭圆曲线Ep(a,b),基点G,私有密钥k,及随机数r。

软件验证用到了:椭圆曲线Ep(a,b),基点G,公开密钥K。

Cracker要想制作注册机,只能通过软件中的Ep(a,b),点G,公开密钥K ,并利用K=kG这个关系获得k后,才可以。而求k是很困难的。 练习:

下面也是一种常于软件保护的注册算法,请认真阅读,并试回答签名过程与验证过程都用到了那些参数,Cracker想制作注册机,应该如何做。

软件作者按如下方法制作注册机(也可称为签名过程)

1、选择一条椭圆曲线Ep(a,b),和基点G;

2、选择私有密钥k(k

3、产生一个随机整数r(r< p>

4、将用户名作为参数,计算Hash=SHA(username);

5、计算 x’=x (mod n)

6、计算sn≡(Hash+x’*k)/r (mod n)

7、将sn和x’作为 用户名username的序列号

软件验证过程如下:(软件中存有椭圆曲线Ep(a,b),和基点G,公开密钥K)

1、从用户输入的序列号中,提取sn以及x’;

2、将用户名作为参数,计算Hash=SHA(username); 3、计算 R=(Hash*G+x’*K)/sn,如果sn、Hash正确,其值等于软件作者签名过程中点R(x,y),因为

sn≡(Hash+x’*k)/r (mod n)

所以

(Hash*G+x’*K)/sn

=(Hash*G+x’*K)/*(Hash+x’*k)/r+ =(Hash*G+x’*K)/*(Hash*G+x’*k*G)/(rG)+ =rG**(Hash*G+x’*K)/(Hash*G+x’*K)+ =rG=R (mod p) 4、v≡x (mod n)

5、如果v=x’ 则注册成功。如果v≠x’ ,则注册失败。

八、结语

历经半个多月断断续续的写作,这篇拙作终于算告一段落了。为写这篇文章,我查了大量的资料,但为了使文章更通俗易懂,我尽量避免涉及专业术语,F2n域上的椭圆曲线本文也没有涉及。不过,一些名词描述的可能还不太精确,希望众读者对文章的问题,多多批评指正。我也仅仅把这篇文章作为初稿,我会不断修订他的。最后感谢看雪、Sunbird、CCG以及看雪论坛所有成员对我的支持,感谢一切帮助过我的人,没有你们的鼓励,这篇文章我是没有动力写完的,谢谢,谢谢大家!

主要参考文献

张禾瑞,《近世代数基础》,高等教育出版社,1978 闵嗣鹤 严士健,《初等数论》,高等教育出版社,1982

段云所,《网络信息安全》第三讲,北大计算机系

Michael Rosing ,chapter5《Implementing Elliptic Curve Cryptography》,Softbound,1998

《SEC 1: Elliptic Curve Cryptography》,Certicom Corp.,2000

《IEEE P1363a / D9》,2001