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; 
}