资源简介
实现了ECC算法的加密解密,主要是对字符串的加解密。
(Realize the ECC algorithm encrypt, decrypt, is mainly to the string encryption.)
代码片段和文件信息
/* 1、用户A选定一条适合加密的椭圆曲线Ep(ab)(如:y2=x3+ax+b),并取椭圆曲线上一点,作为基点G。
2、用户A选择一个私有密钥k,并生成公开密钥K=kG。
3、用户A将Ep(ab)和点K,G传给用户B。
4、用户B接到信息后 ,将待传输的明文编码到Ep(ab)上一点M,并产生一个随机整数r(r 5、用户B计算点C1=M+rK;C2=rG。
6、用户B将C1、C2传给用户A。
7、用户A接到信息后,计算C1-kC2,结果就是点M。因为
C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M
再对点M进行解码就可以得到明文。
密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:
T=(pabGnh)。
(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。
*/
#include
#include
#include
#include
#include “tommath.h“
#include
#define BIT_LEN 800
#define KEY_LONG 160 //私钥比特长
#define P_LONG 200 //有限域P比特长
#define EN_LONG 40 //一次取明文字节数(x20)(y20)
int CYPTEXT[600]={‘\0‘};
int CYPCOUNT=0;
int PLAINCOUNT=0;
//得到lon比特长素数
int GetPrime(mp_int *mint lon);
//得到B和G点X坐标G点Y坐标.G点X坐标随机得到。b随机得到。a,p此时已知。
void Get_B_X_Y(mp_int *x1mp_int *y1mp_int *b mp_int *a mp_int *p);
//点乘
bool Ecc_points_mul(mp_int *qxmp_int *qy mp_int *px mp_int *pymp_int *dmp_int *amp_int *p);
//点加
int Two_points_add(mp_int *x1mp_int *y1mp_int *x2mp_int *y2mp_int *x3mp_int *y3mp_int *abool zeromp_int *p);
//二进制存储密文
int chmistore(mp_int *aFILE *fp);
//把读取的字符存入mp_int型数
int putin(mp_int *achar *chint chlong);
//ECC加密
void Ecc_encipher(mp_int *qxmp_int *qy mp_int *px mp_int *pymp_int *amp_int *p);
//ECC解密
void Ecc_decipher(mp_int *k mp_int *amp_int *p);
//实现将mp_int数a中的比特串还原为字符串并赋给字符串ch:
int chdraw(mp_int *achar *ch);
//取密文
int miwendraw(mp_int *achar *chint chlong);
int myrng(unsigned char *dst int len void *dat)
{
int x;
for (x = 0; x < len; x++) dst[x] = rand() & 0xFF;
return len;
}
void main(){
cout<<“\n 本程序实现椭圆曲线的加密解密“<
cout<<“\n------------------------------------------------------------------------\n“<
mp_int GX;
mp_int GY;
mp_int K; //私有密钥
mp_int A;
mp_int B;
mp_int QX;
mp_int QY;
mp_int P; //Fp中的p(有限域P)
//初始化各个mp_int结构
mp_init(&GX);
mp_init(&GY);
mp_init(&K);
mp_init(&A);
mp_init(&B);
mp_init(&QX);
mp_init(&QY);
mp_init(&P);
//随机数发生器初始化
time_t t;
srand( (unsigned) time( &t ) );
//初始化椭圆曲线各个参数
printf(“椭圆曲线的参数如下(以十进制显示):\n“);
GetPrime(&PP_LONG);
printf(“有限域 P 是:\n“);
char temp[800]={0};
mp_toradix(&Ptemp10);
printf(“%s\n“temp);
GetPrime(&A30);
char tempA[800]={0};
printf(“曲线参数 A 是:\n“);
mp_toradix(&AtempA10);
printf(“%s\n“tempA);
Get_B_X_Y(&GX&GY&B&A&P);
char tempB[800]={0};
printf(“曲线参数 B 是:\n“);
mp_toradix(&BtempB10);
printf(“%s\n“tempB);
char tempGX[800]={0};
printf(“曲线G点X坐标是:\n“);
mp_toradix(&GXtempGX10);
printf(“%s\n“tempGX);
char tempGY[800]={0};
printf(
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3318784 2011-03-31 17:14 ecc\Debug\my_ecc.bsc
文件 262196 2011-03-31 17:14 ecc\Debug\my_ecc.exe
文件 383376 2011-03-31 17:14 ecc\Debug\my_ecc.ilk
文件 37099 2011-03-31 17:14 ecc\Debug\my_ecc.obj
文件 325956 2011-03-31 16:00 ecc\Debug\my_ecc.pch
文件 861184 2011-03-31 17:14 ecc\Debug\my_ecc.pdb
文件 0 2011-03-31 17:14 ecc\Debug\my_ecc.sbr
文件 11355 2011-03-30 14:39 ecc\Debug\StdAfx.obj
文件 0 2011-03-30 14:39 ecc\Debug\StdAfx.sbr
文件 222208 2012-03-12 11:22 ecc\Debug\vc60.idb
文件 86016 2011-03-31 17:14 ecc\Debug\vc60.pdb
文件 155136 2006-09-24 14:38 ecc\ecc.lib
文件 21203 2009-03-21 09:35 ecc\ECC程序.txt
文件 369776 2005-01-25 17:40 ecc\MathLib.lib
文件 24768 2011-03-31 17:14 ecc\my_ecc.cpp
文件 3529 2011-03-23 23:14 ecc\my_ecc.dsp
文件 520 2009-04-20 22:16 ecc\my_ecc.dsw
文件 99328 2012-03-12 11:24 ecc\my_ecc.ncb
文件 55808 2012-03-12 11:24 ecc\my_ecc.opt
文件 246 2012-03-12 11:00 ecc\my_ecc.plg
文件 210 2004-04-15 22:46 ecc\Source\ecc.bpf
文件 5434 2006-09-24 14:38 ecc\Source\ecc.bpr
文件 1969 2005-02-04 12:19 ecc\Source\ecc.h
文件 4466 2005-04-02 20:23 ecc\Source\eccBrowseForDirectory.cpp
文件 3311 2005-02-04 12:19 ecc\Source\eccBrowseForDirectory.h
文件 1251 2005-02-04 12:19 ecc\Source\eccCheckStringList.cpp
文件 2160 2005-02-04 12:19 ecc\Source\eccCheckStringList.h
文件 2646 2005-02-04 12:19 ecc\Source\eccError.cpp
文件 2479 2005-02-04 12:19 ecc\Source\eccError.h
文件 14865 2005-03-01 14:52 ecc\Source\eccFile.cpp
............此处省略46个文件信息
相关资源
- C++ 命令行小游戏 节奏大师别踩白块
- 酒店客房预定系统vc++)
- 求点介数C++实现 Betweenness Centrality
- 关键路径的算法源代码
- C++信号放大器+报告+源码+运行程序
- 编译原理用C++消除左递归
- C++并发编程实战pdf高清无码
- vc++变成经典小游戏源码
- Visual C++网络与数据库编程百例源代码
- 移动最小二乘法MLS基于C++代码实现
- 车牌识别系统VC++开发
- 使用C/C++读取BITMAP的内容
- C++ KTV点歌系统
- 精通VC++指纹模式识别系统算法(源码
- C++学生成绩管理系统( 毕业设计)
- 用C++写的FTP客户端
- C++学生成绩管理系统97917
- c++编写的十字路口交通灯程序
- C++编写的模拟流体运动
- 禁忌搜索算法30城市TSP问题C++源代码
- 火烧连营C++版本
- C语言c++游戏源代码大全
- 数据结构与程序设计C++语言描述(中
- C++版计算器带括号dos版本
- C++ Primer 第五版 中文版+英文版+习题集
- MFC多人聊天室
- 编译原理 LR分析器 c++代码
- C++ primer 第三版习题答案
- C++实现AES、DES加密算法含MFC界面
- C++课程设计 扑克牌游戏内含2程序
评论
共有 条评论