椭圆曲线密码的C语言设计与实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机研究生开放研究

《椭圆曲线密码的C语言设计与实现》

美国GeneChiu基金资助

基于TOM算法库的ECC加密算法的C语言设计与实现

研究生徐立均

内容:

一、源代码下载

二、ECC算法的设计思想

三、椭圆曲线参数的选取和基点的确定

四、椭圆曲线的点加和纯量乘法

五、加密文件的读入与输出

六、密文的存取和读入

七、ECC加密的实现

八、ECC解密的实现

九、测试结果及分析

一、源代码下载

本文使用了TOM算法库实现了椭圆曲线公钥密码体制,能对各类不同的磁盘文件进行加密和解密。

1 请下载可执行程序MY_ECC.exe,此程序无需任何额外的LIB或DLL,可在Windows下独立运行,运行情况如下:

2 请下载源代码source.rar:

编译此源代码需要使用TOM的高精度算法库

MathLib.lib

和相关的头文件

tommath.h

tommath_class.h

tommath_superclass.h

一并打包在source.rar中,请下载

3 对于TOM的高精度算法库的详细说明,请看本站C语言:

二、 ECC算法的设计思想

根据椭圆曲线进行加密通信的过程,首先选定一个适合加密的椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。选择一个私有密钥k,并生成公开密钥K=kG。加密时,将明文编码到Ep(a,b)上一点M,并产生一个随机整数r(r < n)。计算点C1=M+rK;C2=rG。将C1、C2存入密文。解密时,从密文中读出C1、C2,计算C1-kC2,根据:C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M,

解得的结果就是点M,即明文。

三、椭圆曲线参数的选取和基点的确定

并不是所有的椭圆曲线都适合加密,y^2=x^3+ax+b是一类可以用来加密的椭圆曲线,也是最为简单的一类。下面我们就选用

y^2=x^3+ax+b作为我们的加密曲线。这条曲线定义在Fp上:两个满足下列条件的小于p(p为素数)的非负整数a、b:4a3+27b2≠0 (mod p) 则满足下列方程的所有点(x,y),再加上无穷远点∞ ,构成一条椭圆曲线。y^2=x^3+ax+b(mod p) 其中 x,y属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。

参数P的选取:p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;我们将p取为200比特位的素数。

参数a、b的选取:先随机产生小于P-1的正整数作为参数a,依据条件4a3+27b2≠0 (mod p)判断随机产生的小于P-1的正整数是否适合作为参数b.

基点的确定:随着参数a,b,p确定,这条曲线y^2=x^3+ax+b就定下来了。先随机产生0到p-1间的整数作为基点x坐标,计算x^3+ax+b 的结果再开方就得出基点y坐标。

上述具体程序实现如下:

……

while(1)

{

//4a3+27b2≠0 (mod p)

GetPrime(b,40);//先随机产生一个参数B

mp_expt_d(a, 3, &temp1);

mp_sqr(b, &temp2);

mp_mul_d(&temp1, 4, &temp3);

mp_mul_d(&temp2, 27, &temp4);

mp_add(&temp3, &temp4, &temp5);

mp_mod(&temp5,p,&temp);

if(mp_cmp(&temp, &compare)!=0 )

{

break; //满足条件跳出循环

}

}

//y2=x3+ax+b,随机产生X坐标,根据X坐标计算Y坐标GetPrime(x1,30);// 随机产生30比特长的X坐标

mp_expt_d(x1, 3, &temp6);

mp_mul(a, x1, &temp7);

mp_add(&temp6, &temp7, &temp8);

mp_add(&temp8, b, &tempx);

mp_sqrt(&tempx, y1);//得到Y坐标

……..

私钥的确定:随机选取1到P-1之间的素数作为私钥d.

公钥的确定:由d乘我们所确定的基点得到公钥K,即K=dG。

四、椭圆曲线的点加和纯量乘法

对于一般的椭圆曲线方程y^2+a1xy+a3y=x^3+a2x^2+a4x+a6, 设点P(x1,y1),Q(x2,y2)的和R(x3,y3)的坐标。R(x3,y3)的计算公式如下:

x3=k^2+ka1+a2+x1+x2;

y3=k(x1-x4)-y1-a1x4-a3;

其中k= (y1-y2)/(x1-x2)

当P≠Q时

k=(3x2+2a2x+a4 -a1y) /(2y+a1x+a3)

当P=Q时,对于椭圆曲线方程Y^2=X^3+aX+b,上述的公式变为:

x3=θ2- x1-x2;

y3=θ(x1-x3)-y1

其中θ=(y1-y2)/(x1-x2) 当P≠Q时;

θ=(3x1^2-a)/2y1 当P=Q时

由上述运算公式,可以得出点积mP的运算,即mP=P+P+…+P,共m个P相加,这里m∈N.

具体算法为:设m的二进制表示为

m=(m_n-1m_n-2…m1m0),其中m_n-1=1,Q=P,从左到右依次计算:

for(I=n-2 to 0)

{ Q=2Q;

if(mi ==1) Q=Q+P;

}

则Q=mP.

Return ;

函数原形为:

相关文档
最新文档