椭圆曲线密码的C语言设计与实现
更新时间:2023-07-25 01:35:01 阅读量: 实用文档 文档下载
- 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 < 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 ) { } }
//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坐标
break; //满足条件跳出循环
……..
私钥的确定:随机选取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 ;
函数原形为:
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比特,因此一个单元最多可存放三个半字节。为充分利用存取空间,采用 一个单元放三个半字节。 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_int 7;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实现每次循环跳两个单元
}
函数原型为:int putin(mp_int *a,char *ch,int chlong) 成功返回0
2.函数chdraw()实现将mp_int数a中的比特串还原为字符串并赋给字符串ch:
chdraw和putin是相反过程,将putin存入字符的过程反过来取出字符。
函数原型为:int chdraw(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时截止。 读出之后赋值就简单了。
存密文: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坐标,后一段做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依次存入密文文件。
putin(&mx, miwenx,Residue+1);//文件存入 mp_zero(&my);
for(i=0; i 0)// Residue为剩余字符数 {
if (Residue <= enlongtemp )
{
fread(miwenx,1,Residue,fp);//读入字符串 miwenx[Residue]=char(255);
}
串
{
fread(miwenx,1,enlongtemp,fp);//读入字符
miwenx[enlongtemp]=char(255);
fread(miweny,1,Residue-enlongtemp,fp);//
读入字符串 入
putin(&my,
putin(&mx, miwenx,enlongtemp+1);//文件存
miweny[Residue-enlongtemp]=char(255);
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);
函数原型为:void Ecc_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 ) goto L1; } 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); int chtem;
chtem=chdraw(&mx,stemp);//从ming中取出字符串 //保存解密结果
for(int kk=0;kk < chtem;kk++) {
fprintf(fq,"%c",stemp[kk]); }
chtem=chdraw(&my,stemp);//从ming中取出字符串
//保存解密结果
for(kk=0;kk < chtem;kk++) {
fprintf(fq,"%c",stemp[kk]); } }
函数原型为: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语言设计与实现07-25
马说练习题及答案03-10
采用EPON技术组建校园网 - 图文05-27
智慧物流园区信息平台建设规划方案04-09
勤俭节约伴我行作文600字06-20
小学一年级(三起)新标准英语句子复习(第二册)M1-M809-06
SQL 连接字符串的说明05-21
网络安全之入侵检测技术精编版04-05
餐桌前的一家人作文500字06-27
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 椭圆
- 曲线
- 密码
- 语言
- 实现
- 设计
- 德国留学热门专业之建筑学
- 学校卫生评比细则
- 数学:2.1数怎么不够用了同步练习3(北师大版七年级上)
- 2012年历史学业水平测试考纲必修三 第三单元
- 法学专科调查报告模版201109
- 留学回国人员申请办理就业落户程序及流程
- 煤自燃火灾监测预警技术的研究现状与发展
- 南昌工程学院工程地质复习题(附答案)
- 国内外各种混凝土外加剂种类以及各种外加剂的特性、适用范围
- 市委党校学院工程施工组织设计
- 风力发电机组并网方式初探
- X—NOTAM进展及应用
- 山东省病历书写基本规范1
- 人教版八年级生物上册期末考试复习提纲
- 燃气企业突发重大社会安全事件应急预案
- 跑步装备介绍:压缩裤篇
- 第九章 陶瓷的烧结原理与工艺
- 浅谈长洲水利枢纽电站南瑞SAFR_2000型调速器的优缺点
- 中公管理人为您解读管理类专业硕士报考条件
- 社会实践基地的概况