📄 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 + -