-
大小: 46KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2023-12-18
- 語(yǔ)言: 其他
- 標(biāo)簽: ecc??ecc使用??ecc例子??ecc實(shí)例??
資源簡(jiǎn)介
包括ecc算法和使用的源代碼。找了那么久一直都沒有好用的。我提供個(gè)完全可以用的。里面有說明。在vs2010下編譯測(cè)試過。

代碼片段和文件信息
/* 1、用戶A選定一條適合加密的橢圓曲線Ep(ab)(如:y2=x3+ax+b),并取橢圓曲線上一點(diǎn),作為基點(diǎn)G。
2、用戶A選擇一個(gè)私有密鑰k,并生成公開密鑰K=kG。
?? ?3、用戶A將Ep(ab)和點(diǎn)K,G傳給用戶B。
??4、用戶B接到信息后?,將待傳輸?shù)拿魑木幋a到Ep(ab)上一點(diǎn)M,并產(chǎn)生一個(gè)隨機(jī)整數(shù)r(r ??5、用戶B計(jì)算點(diǎn)C1=M+rK;C2=rG。
??6、用戶B將C1、C2傳給用戶A。
??7、用戶A接到信息后,計(jì)算C1-kC2,結(jié)果就是點(diǎn)M。因?yàn)?br/> C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M
再對(duì)點(diǎn)M進(jìn)行解碼就可以得到明文。
密碼學(xué)中,描述一條Fp上的橢圓曲線,常用到六個(gè)參量:
T=(pabGnh)。
(p?、a?、b?用來(lái)確定一條橢圓曲線,G為基點(diǎn),n為點(diǎn)G的階,h?是橢圓曲線上所有點(diǎn)的個(gè)數(shù)m與n相除的整數(shù)部分)
這幾個(gè)參量取值的選擇,直接影響了加密的安全性。參量值一般要求滿足以下幾個(gè)條件:
1、p?當(dāng)然越大越安全,但越大,計(jì)算速度會(huì)變慢,200位左右可以滿足一般安全要求;
2、p≠n×h;
3、pt≠1?(mod?n),1≤t<20;
4、4a3+27b2≠0?(mod?p);
5、n?為素?cái)?shù);
6、h≤4。
*/
#include?
#include?
#include?
//#include?
#include?
#include?“tommath.h“
#include?“ecc.h“
#define?BIT_LEN?800?
#define?KEY_LONG?128??//私鑰比特長(zhǎng)
#define?P_LONG?200????//有限域P比特長(zhǎng)
#define?EN_LONG?40????//一次取明文字節(jié)數(shù)(x20)(y20)
//得到lon比特長(zhǎng)素?cái)?shù)
int?GetPrime(mp_int?*mint?lon);
//得到B和G點(diǎn)X坐標(biāo)G點(diǎn)Y坐標(biāo)
void?Get_B_X_Y(mp_int?*x1mp_int?*y1mp_int?*b??mp_int?*a??mp_int?*p);
//點(diǎn)乘
bool?Ecc_points_mul(mp_int?*qxmp_int?*qy?mp_int?*px?mp_int?*pymp_int?*dmp_int?*amp_int?*p);
//點(diǎn)加
int?Two_points_add(mp_int?*x1mp_int?*y1mp_int?*x2mp_int?*y2mp_int?*x3mp_int?*y3mp_int?*abool?zeromp_int?*p);
//二進(jìn)制存儲(chǔ)密文
int?chmistore(mp_int?*aFILE?*fp);
//把讀取的字符存入mp_int型數(shù)
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);
//實(shí)現(xiàn)將mp_int數(shù)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? 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);?
//--------------------------------------
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件?????196483??2012-09-27?14:18??ecc實(shí)例\ecc.c
?????文件?????????84??2008-04-17?02:07??ecc實(shí)例\ecc.h
?????文件????????872??2012-09-27?16:58??ecc實(shí)例\ecc.sln
????..A..H.??????9216??2012-09-27?16:59??ecc實(shí)例\ecc.suo
?????文件???????6133??2012-09-27?12:50??ecc實(shí)例\ecc.vcxproj
?????文件????????143??2012-09-27?12:50??ecc實(shí)例\ecc.vcxproj.user
?????文件??????17301??2010-09-26?21:26??ecc實(shí)例\tommath.h
?????文件??????21027??2008-04-17?02:27??ecc實(shí)例\tommath_class.h
?????文件???????2310??2007-03-10?18:45??ecc實(shí)例\tommath_superclass.h
?????文件???????1117??2012-09-27?17:14??ecc實(shí)例\使用說明.txt
?????目錄??????????0??2012-09-27?17:14??ecc實(shí)例
-----------?---------??----------?-----??----
???????????????254686????????????????????11
評(píng)論
共有 條評(píng)論