资源简介

包括ecc算法和使用的源代码。找了那么久一直都没有好用的。我提供个完全可以用的。里面有说明。在vs2010下编译测试过。

资源截图

代码片段和文件信息


/* 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 
#include “tommath.h“
#include “ecc.h“

#define BIT_LEN 800 
#define KEY_LONG 128  //私钥比特长
#define P_LONG 200    //有限域P比特长
#define EN_LONG 40    //一次取明文字节数(x20)(y20)


//得到lon比特长素数
int GetPrime(mp_int *mint lon);
//得到B和G点X坐标G点Y坐标
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;
}


int main(){
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)
time_t t;      
char temp[800]={0};
char tempA[800]={0};
char tempB[800]={0};
char tempGX[800]={0};
char tempGY[800]={0};
char tempK[800]={0};
char tempQX[800]={0};
char tempQY[800]={0};
char cc;

printf(“\n          ECC“);

printf(“\n------------------------------------------------------------------------\n“);


mp_init(&GX);
mp_init(&GY);
mp_init(&K);
mp_init(&A);
mp_init(&B);
mp_init(&QX);
mp_init(&QY);
mp_init(&P);
     
srand( (unsigned) time( &t ) );

printf(“Parameters list blow(Decimal):\n“);

GetPrime(&PP_LONG);
printf(“P:\n“);
mp_toradix(&Ptemp10);
printf(“%s\n“temp);    

GetPrime(&A30);
printf(“A:\n“);
mp_toradix(&AtempA10);
printf(“%s\n“tempA); 

Get_B_X_Y(&GX&GY&B&A&P);

printf(“B:\n“);
mp_toradix(&BtempB10);
printf(“%s\n“tempB); 

printf(“G coordinate X:\n“);
mp_toradix(&GXtempGX10);
printf(“%s\n“tempGX);   

printf(“G coordinate Y:\n“);
mp_toradix(&GYtempGY10);
printf(“%s\n“tempGY); 


//--------------------------------------

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     196483  2012-09-27 14:18  ecc实例\ecc.c

     文件         84  2008-04-17 02:07  ecc实例\ecc.h

     文件        872  2012-09-27 16:58  ecc实例\ecc.sln

    ..A..H.      9216  2012-09-27 16:59  ecc实例\ecc.suo

     文件       6133  2012-09-27 12:50  ecc实例\ecc.vcxproj

     文件        143  2012-09-27 12:50  ecc实例\ecc.vcxproj.user

     文件      17301  2010-09-26 21:26  ecc实例\tommath.h

     文件      21027  2008-04-17 02:27  ecc实例\tommath_class.h

     文件       2310  2007-03-10 18:45  ecc实例\tommath_superclass.h

     文件       1117  2012-09-27 17:14  ecc实例\使用说明.txt

     目录          0  2012-09-27 17:14  ecc实例

----------- ---------  ---------- -----  ----

               254686                    11


评论

共有 条评论