椭圆曲线密码的C语言设计与实现.docx
- 文档编号:29820869
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:13
- 大小:97.28KB
椭圆曲线密码的C语言设计与实现.docx
《椭圆曲线密码的C语言设计与实现.docx》由会员分享,可在线阅读,更多相关《椭圆曲线密码的C语言设计与实现.docx(13页珍藏版)》请在冰豆网上搜索。
椭圆曲线密码的C语言设计与实现
计算机研究生开放研究
《椭圆曲线密码的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 计算点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(modp)则满足下列方程的所有点(x,y),再加上无穷远点∞,构成一条椭圆曲线。 y^2=x^3+ax+b(modp)其中x,y属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。 参数P的选取: p当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;我们将p取为200比特位的素数。 参数a、b的选取: 先随机产生小于P-1的正整数作为参数a,依据条件4a3+27b2≠0(modp)判断随机产生的小于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(modp) 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-2to0) {Q=2Q; if(mi==1)Q=Q+P; } 则Q=mP. Return; 函数原形为: boolEcc_points_mul(mp_int*qx,mp_int*qy,mp_int*px,mp_int*py,mp_int*d,mp_int *a,mp_int*p) 成功返回true。 intTwo_points_add(mp_int*x1,mp_int*y1,mp_int*x2,mp_int*y2,mp_int*x3,mp_int *y3,mp_int*a,boolzero,mp_int*p) 成功返回1。 五、加密文件的读入与输出 mp_digit只用28比特,因此一个单元最多可存放三个半字节。 为充分利用存取空间,采用 一个单元放三个半字节。 1.函数putin()实现将明文的二进制比特串赋给mp_int数a: 主要循环部分及说明如下: //chlong为要存入的字符数组长 for(j=0;j<<="(mp_digit)CHAR_BIT;"*temp存入字符255);左移8位存入高8位并向左移8位,以便放入下一个字符temp跳过前一个单元,先存入后一单元*++temp每次跳七个字符i+="7;"的两个单元中以7个字符为单元循环,把七个字符放入的mp_int7;j++){>>4);//存放被切分的字符的高四位,temp跳回前一个单元 //存入第一单元 *temp|=(mp_digit)(ch[i-4]&yy);//存放被切分的字符的低四位,yy=(mp_digit)15 *temp<<=(mp_digit)CHAR_BIT;//向左移8位,以便放入下一个字符 *temp|=(mp_digit)(ch[i-5]&255);//存入字符 *temp<<=(mp_digit)CHAR_BIT;//左移8位 *temp|=(mp_digit)(ch[i-6]&255);//存入字符 *temp<<=(mp_digit)CHAR_BIT;//左移8位 *temp++|=(mp_digit)(ch[i-7]&255);//存放被切分的字符的低四位,temp跳到后一个单元 temp++;//再向后跳一单元,这样和下次的++temp实现每次循环跳两个单元 } 函数原型为: intputin(mp_int*a,char*ch,intchlong) 成功返回0 2.函数chdraw()实现将mp_int数a中的比特串还原为字符串并赋给字符串ch: chdraw和putin是相反过程,将putin存入字符的过程反过来取出字符。 函数原型为: intchdraw(mp_int*a,char*ch) 成功返回0 六、密文的存取和读入 此过程难点是如何保证存入文件后,再从文件中读取密文并存入mp_int型数后,和原存放密文的mp_int型数不能有一个比特位的改变。 存取时先存*mp->dp的最高8位,再依次往下存后面3个8位。 依据*mp->dp的特点,最高8位为0000xxxx,因此,可将255作为一个密文段的结束标志,把前一密文段和后一密文段区分开。 这样在密文文件中,密文的存取结构为: 0000xxxx|xxxxxxxx|xxxxxxxx|xxxxxxxx|0000xxxx|……|11111111|0000xxxx|xxxxxxxx|….. 0字节1字节2字节3字节4字节4x字节下一加密段x为1或0利用fgetc每次读取一个字符,并赋值给一个字符数组。 当a[i]=255,且i%4=0时截止。 读出之后赋值就简单了。 存密文: intchmistore(mp_int*a,FILE*fp)成功返回0把密文赋给mp_int型数a: intmiwendraw(mp_int*a,char*ch,intchlong)成功返回0 七、ECC加密的实现 加密时因P长度取值为200比特,所以所取明文长度应在0到199比特之间,另外需要一个附加的标志字节char(255),所以一次取明文最大长为191比特。 在本程序中一次取20字节。 和RSA不同,ECC运算是基于点的运算。 一个点有两个参数,一个X坐标,一个Y坐标。 所以取明文时需一次取两段,前一段做X坐标,后一段做Y坐标。 因此,一次加密明文为40字节。 由于每次加密要取两段,引发了另外一个问题: 当加密文件末尾所剩明文长度小于20字节时的处理。 在本程序中,我们的解决是将剩余明文取作X,而将Y取作0,且不加标志字节char(255),这样解密时,程序在Y中找不到标志字节char(255),就 不会往解密文中存任何东西。 取得明文后,产生一个随机整数r(r<有限域p),计算点C1=M+rK;C2=rG。 将点C1、C2坐标c1x,c1y,c2x,c2y依次存入密文文件。 for(i=0;i0)//Residue为剩余字符数 { if(Residue<=enlongtemp) { fread(miwenx,1,Residue,fp);//读入字符串 miwenx[Residue]=char(255); putin(&mx,miwenx,Residue+1);//文件存入 mp_zero(&my); } else { fread(miwenx,1,enlongtemp,fp);//读入字符串 miwenx[enlongtemp]=char(255); fread(miweny,1,Residue-enlongtemp,fp);//读入字符串 miweny[Residue-enlongtemp]=char(255); putin(&mx,miwenx,enlongtemp+1);//文件存入 putin(&my,miweny,Residue-enlongtemp+1);//文件存入 } //加密 Ecc_points_mul(&c2x,&c2y,px,py,&r,a,p);//C2=rG Ecc_points_mul(&tempx,&tempy,qx,qy,&r,a,p);//rK Two_points_add(&mx,&my,&tempx,&tempy,&c1x,&c1y,a,zero,p);//C1=M+rK //保存密文 chmistore(&c1x,fq); chmistore(&c1y,fq); chmistore(&c2x,fq); chmistore(&c2y,fq); } 函数原型为: voidEcc_encipher(mp_int*qx,mp_int*qy,mp_int*px,mp_int*py,mp_int *a,mp_int*p); 八、ECC解密的实现 解密时,依据存密文时放入的结束标志255,读入密文。 依次取4段,调用miwendraw将密文存入mp_int型数中,还原为加密时存入的点C1和C2坐标c1x,c1y,c2x,c2y。 依据C1-dC2=M+rK-k(rG)=M+rK-r(kG)=M。 计算C1-dC2(d为私钥),得到明文点坐标mx,my。 其中两点减的计算可如下: -Q=(X,-Y);P-Q=P+(-Q);-Y=P-Y; 计算C1-dC2完毕后调用chdraw取出mp_int中的明文比特串,依次存入解密文件中,完成解密。 while(! feof(fp)) { //取C1点X坐标 i=0; while (1) { stemp[i]=fgetc(fp); if(i%4==0) { if(int(stemp[i]&0xFF)==255)gotoL1; } i++; } L1: miwendraw(&c1x,stemp,i); …………//取其他坐标 Ecc_points_mul(&tempx,&tempy,&c2x,&c2y,k,a,p);//计算dC2 mp_neg(&tempy,&temp);//-Q=(X,-Y) Two_points_add(&c1x,&c1y,&tempx,&temp,&mx,&my,a,zero,p); intchtem; chtem=chdraw(&mx,stemp);//从ming中取出字符串 //保存解密结果 for(intkk=0;kk { fprintf(fq,"%c",stemp[kk]); } chtem=chdraw(&my,stemp);//从ming中取出字符串 //保存解密结果 for(kk=0;kk { fprintf(fq,"%c",stemp[kk]); } } 函数原型为: voidEcc_decipher(mp_int*k,mp_int*a,mp_int*p); 九、测试结果及分析 为验证系统的加密解密功能,对系统进行了如下测试: 测试环境 Intelp4CPU1.5G256MRAMwindows2000advantedserver 测试结果 利用系统对文本文件、BMP、WORD、EXCEL、EXE等文件进行加密,然后解密。 验证结果表明,给定的明文经系统加密后再解密的结果完全一致,没有一个比特的偏差。 较好 的实现了ECC的功能。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 椭圆 曲线 密码 语言 设计 实现