www.pudn.com > TomCrypt.rar > ecc_makekey.cpp
//密钥生成器源文件 #include#include #include #include #include #pragma link "tomcrypt.lib" int main(int argc, char* argv[]) { printf("Rinick 椭圆曲线密钥生成器,程序使用tomcrypt加密函数库\n\n"); if(fopen("private_key.c", "rb")!=NULL){ printf("错误!\nprivate_key.c已存在,为了防止误删,请手动删除\n\n"); system("pause"); return 0; } char tempChar[90]; //随机数状态初始化 int pn=register_prng(&rc4_desc);//随机数生成方式,可以选择其他方式,参考crypt.pdf第56页 prng_state tg; prng_descriptor[pn].start(&tg); printf("输入一些内容来扰乱随机数,输入0系统会自动分配随机数\n?:"); scanf("%64s",tempChar); if(tempChar[0]=='0' && tempChar[1]==0){ int getrand; prng_descriptor[pn].add_entropy((char*)&getrand,2,&tg); for(int i=0;i<5;++i){ srand(time(NULL)); for(int j=0;j<5;++j){ getrand=rand(); prng_descriptor[pn].add_entropy((char*)&getrand,2,&tg); } } }else{ while(tempChar[0]!='0' || tempChar[1]!=0){ prng_descriptor[pn].add_entropy(tempChar,strlen(tempChar),&tg); printf("你还可以继续输入来增加随机性,输入0终止初始化\n?:"); scanf("%64s",tempChar); } } prng_descriptor[pn].ready(&tg); int ecclen; printf("\n\n选择椭圆曲线\n可以是192,224,256,384,521\n?:"); scanf("%d",&ecclen); ecclen/=8; if(ecclen>65)ecclen=65; ecc_key ekey1; ecc_make_key(&tg,pn,ecclen,&ekey1); FILE *out=fopen("private_key.c", "wt"); fputs("ltc_ecc_mykey.type=PK_PRIVATE;\n",out); fprintf(out,"ltc_ecc_mykey.idx=%d;\n",ekey1.idx); fputs("mp_init_multi(<c_ecc_mykey.pubkey.x, <c_ecc_mykey.pubkey.y, <c_ecc_mykey.pubkey.z, <c_ecc_mykey.k, NULL);\n",out); mp_toradix (&ekey1.pubkey.x, tempChar, 64); fprintf(out,"mp_read_radix(<c_ecc_mykey.pubkey.x, \"%s\", 64);\n",tempChar); mp_toradix (&ekey1.pubkey.y, tempChar, 64); fprintf(out,"mp_read_radix(<c_ecc_mykey.pubkey.y, \"%s\", 64);\n",tempChar); fputs("mp_set(<c_ecc_mykey.pubkey.z, 1);\n",out); mp_toradix (&ekey1.k, tempChar, 64); fprintf(out,"mp_read_radix(<c_ecc_mykey.k, \"%s\", 64);\n",tempChar); fclose(out); out=fopen("public_key.c", "wt"); fputs("ltc_ecc_mykey.type=PK_PUBLIC;\n",out); fprintf(out,"ltc_ecc_mykey.idx=%d;\n",ekey1.idx); fputs("mp_init_multi(<c_ecc_mykey.pubkey.x, <c_ecc_mykey.pubkey.y, <c_ecc_mykey.pubkey.z, <c_ecc_mykey.k, NULL);\n",out); mp_toradix (&ekey1.pubkey.x, tempChar, 64); fprintf(out,"mp_read_radix(<c_ecc_mykey.pubkey.x, \"%s\", 64);\n",tempChar); mp_toradix (&ekey1.pubkey.y, tempChar, 64); fprintf(out,"mp_read_radix(<c_ecc_mykey.pubkey.y, \"%s\", 64);\n",tempChar); fputs("mp_set(<c_ecc_mykey.pubkey.z, 1);\n",out); fputs("mp_set(<c_ecc_mykey.k, 0);\n",out); fclose(out); printf("\n你的密钥信息保存在private_key.c中,公钥信息保存在public_key.c,请将这两个文件复制到工程目录下并妥善备份\n\n"); system("pause"); return 0; }