?? ecc_makekey.cpp
字號:
//密鑰生成器源文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <tomcrypt.h>
#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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -