欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:17632451       资源大小:97.28KB        全文页数:13页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    1、椭圆曲线密码的C语言设计与实现 计算机研究生开放研究 椭圆曲线密码的C语言设计与实现 美国GeneChiu基金资助 基于TOM算法库的ECC加密算法的C语言设计与实现研究生 徐立均内容:一、源代码下载二、ECC算法的设计思想三、椭圆曲线参数的选取和基点的确定四、椭圆曲线的点加和纯量乘法五、加密文件的读入与输出六、密文的存取和读入七、ECC加密的实现八、ECC解密的实现九、测试结果及分析一、源代码下载本文使用了TOM算法库实现了椭圆曲线公钥密码体制,能对各类不同的磁盘文件进行加密和解密。1 请下载可执行程序MY_ECC.exe,此程序无需任何额外的LIB或DLL,可在Windows下独立运行,运

    2、行情况如下: 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;C

    3、2=rG。将C1、C2存入密文。解密时,从密文中读出C1、C2,计算C1-kC2,根据:C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M,解得的结果就是点M,即明文。三、椭圆曲线参数的选取和基点的确定并不是所有的椭圆曲线都适合加密,y2=x3+ax+b是一类可以用来加密的椭圆曲线,也是最为简单的一类。下面我们就选用y2=x3+ax+b作为我们的加密曲线。这条曲线定义在Fp上:两个满足下列条件的小于p(p为素数)的非负整数a、b:4a3+27b20 (mod p) 则满足下列方程的所有点(x,y),再加上 无穷远点 ,构成一条椭圆曲线。y2=x3+ax+b(mod p) 其中 x,y

    4、属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。参数P的选取:p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;我们将p取为200比特位的素数。参数a、b的选取:先随机产生小于P-1的正整数作为参数a,依据条件4a3+27b20 (mod p)判断随机产生的小于P-1的正整数是否适合作为参数b.基点的确定:随着参数a,b,p确定,这条曲线y2=x3+ax+b就定下来了。先随机产生0到p-1间的整数作为基点x坐标,计算x3+ax+b的结果再开方就得出基点y坐标。上述具体程序实现如下: while(1)/4a3+27b20 (mod p)GetPrime(b

    5、,40);/先随机产生一个参数Bmp_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, &temp

    6、6);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。四、 椭圆曲线的点加和纯量乘法对于一般的椭圆曲线方程y2+a1xy+a3y=x3+a2x2+a4x+a6, 设点P(x1,y1),Q(x2,y2)的和R(x3,y3)的坐标。R(x3,y3)的计算公式如下:x3=k2+ka1+a2+x1+x2; y3=k(x1-x4)-y

    7、1-a1x4-a3;其中k= (y1-y2)/(x1-x2) 当PQ时k=(3x2+2a2x+a4 -a1y) /(2y+a1x+a3) 当P=Q时,对于椭圆曲线方程Y2=X3+aX+b,上述的公式变为:x3=2- x1-x2;y3=(x1-x3)-y1其中=(y1-y2)/(x1-x2) 当PQ时; =(3x12-a)/2y1 当P=Q时由上述运算公式,可以得出点积mP的运算,即mP=P+P+P,共m个P相加,这里mN.具体算法为:设m的二进制表示为m=(m_n-1m_n-2m1m0),其中m_n-1=1,Q=P,从左到右依次计算:for(I=n-2 to 0) Q=2Q;if(mi =1)

    8、 Q=Q+P;则Q=mP. Return ;函数原形为:bool Ecc_points_mul(mp_int *qx,mp_int *qy, mp_int *px, mp_int *py,mp_int *d,mp_int *a,mp_int *p) 成功返回true。int Two_points_add(mp_int *x1,mp_int *y1,mp_int *x2,mp_int *y2,mp_int *x3,mp_int *y3,mp_int *a,bool zero,mp_int *p) 成功返回1。五、加密文件的读入与输出mp_digit只用28比特,因此一个单元最多可存放三个半字节。

    9、为充分利用存取空间,采用一个单元放三个半字节。1 函数putin()实现将明文的二进制比特串赋给mp_int数a:主要循环部分及说明如下: /chlong为要存入的字符数组长for(j=0;j 4); /存放被切分的字符的高四位,temp跳回前一个单元 /存入第一单元 *temp |= (mp_digit)(chi-4 & yy); /存放被切分的字符的低四位,yy=(mp_digit)15 *temp = (mp_digit)CHAR_BIT; /向左移8位,以便放入下一个字符 *temp |= (mp_digit)(chi-5 & 255); /存入字符 *temp = (mp_digit

    10、)CHAR_BIT; /左移8位 *temp |= (mp_digit)(chi-6 & 255); /存入字符 *temp 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每次读取一个字符,并赋值给一个字符数组

    11、。当ai=255,且i%4=0时截止。读出之后赋值就简单了。存密文:int chmistore(mp_int *a,FILE *fp) 成功返回0把密文赋给mp_int型数a:int miwendraw(mp_int *a,char *ch,int chlong) 成功返回0七、ECC加密的实现加密时因P长度取值为200比特,所以所取明文长度应在0到199比特之间,另外需要一个附加的标志字节char(255),所以一次取明文最大长为191比特。在本程序中一次取20字节。和RSA不同,ECC运算是基于点的运算。一个点有两个参数,一个X坐标,一个Y坐标。所以取明文时需一次取两段,前一段做X坐标,后

    12、一段做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; i 0)/ Residue为剩余字符数 if (Residue = enlongtemp ) fread(miwenx,1,R

    13、esidue,fp);/读入字符串 miwenxResidue=char(255); putin(&mx, miwenx,Residue+1);/文件存入 mp_zero(&my); else fread(miwenx,1,enlongtemp,fp);/读入字符串 miwenxenlongtemp=char(255); fread(miweny,1,Residue-enlongtemp,fp);/读入字符串 miwenyResidue-enlongtemp=char(255); putin(&mx, miwenx,enlongtemp+1);/文件存入 putin(&my, miweny,R

    14、esidue-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); 函数原型为:void Ecc_encip

    15、her(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_in

    16、t中的明文比特串,依次存入解密文件中,完成解密。while(!feof(fp)/取C1点X坐标i=0;while(1)stempi=fgetc(fp);if(i%4=0)if(int(stempi&0xFF) = 255 ) goto L1;i+;L1: miwendraw(&c1x, stemp, i); /取其他坐标Ecc_points_mul(&tempx, &tempy, &c2x, &c2y, k, a, p); / 计算dC2mp_neg(&tempy, &temp);/ -Q=(X,-Y)Two_points_add(&c1x,&c1y,&tempx,&temp,&mx,&my,

    17、a,zero,p);int chtem;chtem=chdraw(&mx,stemp);/从ming中取出字符串/保存解密结果for(int kk=0;kk chtem;kk+)fprintf(fq,%c,stempkk);chtem=chdraw(&my,stemp);/从ming中取出字符串/保存解密结果for(kk=0;kk chtem;kk+)fprintf(fq,%c,stempkk);函数原型为:void Ecc_decipher(mp_int *k, mp_int *a,mp_int *p); 九、测试结果及分析 为验证系统的加密解密功能, 对系统进行了如下测试:测试环境Intel p4 CPU 1.5G 256M RAM windows2000 advanted server测试结果利用系统对文本文件、BMP、WORD、EXCEL、EXE等文件进行加密,然后解密。验证结果表明,给定的明文经系统加密后再解密的结果完全一致,没有一个比特的偏差。较好的实现了ECC的功能。


    注意事项

    本文(椭圆曲线密码的C语言设计与实现.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开