永发信息网

求一个基于openssl写的ecc曲线的源代码

答案:1  悬赏:40  手机版
解决时间 2021-04-03 06:57
求一个基于openssl写的ecc曲线的源代码
最佳答案
下面的例子生成两对ECC密钥,并用它做签名和验签,并生成共享密钥。
#include
#include
#include
#include
#include
#include

int main()
{
EC_KEY *key1,*key2;
EC_POINT *pubkey1,*pubkey2;
EC_GROUP *group1,*group2;
int ret,nid,size,i,sig_len;
unsigned char*signature,digest[20];
BIO *berr;
EC_builtin_curve *curves;
int crv_len;
char shareKey1[128],shareKey2[128];
int len1,len2;


key1=EC_KEY_new();
if(key1==NULL)
{
printf("EC_KEY_new err!\n");
return -1;
}
key2=EC_KEY_new();
if(key2==NULL)
{
printf("EC_KEY_new err!\n");
return -1;
}

crv_len = EC_get_builtin_curves(NULL, 0);
curves = (EC_builtin_curve *)malloc(sizeof(EC_builtin_curve) * crv_len);

EC_get_builtin_curves(curves, crv_len);


nid=curves[25].nid;

group1=EC_GROUP_new_by_curve_name(nid);
if(group1==NULL)
{
printf("EC_GROUP_new_by_curve_name err!\n");
return -1;
}
group2=EC_GROUP_new_by_curve_name(nid);
if(group1==NULL)
{
printf("EC_GROUP_new_by_curve_name err!\n");
return -1;
}

ret=EC_KEY_set_group(key1,group1);
if(ret!=1)
{
printf("EC_KEY_set_group err.\n");
return -1;
}
ret=EC_KEY_set_group(key2,group2);
if(ret!=1)
{
printf("EC_KEY_set_group err.\n");
return -1;
}

ret=EC_KEY_generate_key(key1);
if(ret!=1)
{
printf("EC_KEY_generate_key err.\n");
return -1;
}
ret=EC_KEY_generate_key(key2);
if(ret!=1)
{
printf("EC_KEY_generate_key err.\n");
return -1;
}

ret=EC_KEY_check_key(key1);
if(ret!=1)
{
printf("check key err.\n");
return -1;
}

size=ECDSA_size(key1);
printf("size %d \n",size);
for(i=0;i<20;i++)
memset(&digest[i],i+1,1);
signature=malloc(size);
ERR_load_crypto_strings();
berr=BIO_new(BIO_s_file());
BIO_set_fp(berr,stdout,BIO_NOCLOSE);

ret=ECDSA_sign(0,digest,20,signature,&sig_len,key1);
if(ret!=1)
{
ERR_print_errors(berr);
printf("sign err!\n");
return -1;
}

ret=ECDSA_verify(0,digest,20,signature,sig_len,key1);
if(ret!=1)
{
ERR_print_errors(berr);
printf("ECDSA_verify err!\n");
return -1;
}

pubkey2 = EC_KEY_get0_public_key(key2);

len1=ECDH_compute_key(shareKey1, 128, pubkey2, key1, NULL);
pubkey1 = EC_KEY_get0_public_key(key1);

len2=ECDH_compute_key(shareKey2, 128, pubkey1, key2, NULL);
if(len1!=len2)
{
printf("err\n");
}
else
{
ret=memcmp(shareKey1,shareKey2,len1);
if(ret==0)
printf("生成共享密钥成功\n");
else
printf("生成共享密钥失败\n");
}
printf("test ok!\n");
BIO_free(berr);
EC_KEY_free(key1);
EC_KEY_free(key2);
free(signature);
free(curves);
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
大水清村民委员会地址好找么,我有些事要过去
如何做中国好父母,每一位父母必学
英国伦敦的饮用水和生活用水是分开的吗?
有一首歌歌词是悲风凌虐
出国求婚钻戒要如何带出境入境
女方没离婚怀上了不是他老公的孩子,生育下来
女人经常去酒吧会变成什么样
长沙灵活就业人员只买养老保险有资格购房吗?
TED LAPIDUS腕表图片上这款多少钱
画眉印章干了怎么办?干的印上没有颜色,
单选题My hard work ____. M
为什么上单猴子没人玩 我觉得挺厉害别
工业革命的本质就是竞争替代了早先曾经控制财
我想知道女装堆堆领的纸纸样怎么做?
电脑上Lnk文件是什么意思?
推荐资讯
求手嶌葵《虹》平假名歌词,最好带中文翻译,
魔兽7.0防战神器图文攻略 战士神器任务怎么做
村民堵村路违反法律哪款
中国历史上未尝一败的将军都有谁
卓异卫星接收器位置变了怎么接收
真三国无双3进入游戏的问题.小弟献所有分跪问
为什么盘口有大量比现价更低的买单时,股价反
我准备辞职、单位欠我休息和年假我能即辞即离
哔哩哔哩的《悠久持有者》是官方打码还是哔哩
急求熊猫彩电29MF08T线路图纸、电路图
和阿凡达差不多的电影有哪些?
会变换的 恐怖图片 的奥秘?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?