C语言---基于Openssl 的 ED25519 验签算法

 OpenSSL开源工程中,因ED25519是后补算法,故相关资料较少,最近做的相关工作需要用到ED25519的验签,查询了相关资料后写了一个C语言的简易程序 分享给大家。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bn.h>
#include <openssl/bio.h>
#include <openssl/evp.h>

//ed25519 验签
int ed25519_test()
{
    //签名数据-64位
     uint8_t buf[64]={0xbd,0xe8,0x4e,0xb7,0x0a,0xf2,0xe9,0x8d,0x77,0x47,0xee,0x53,0xe0,0xd0,0x03,0x41,0x08,0x66,0x4b,0xdf,0x1f,0x9d,0x4f,0x3d,0xc7,0x61,0x2e,0xa4,0xc6,0x9a,0x73,0x99,0x99,0x4b,0x4a,0x2a,0x20,0x65,0xd0,0x46,0x52,0x01,0x58,0xa5,0x7c,0xdd,0x11,0x58,0x23,0xec,0xda,0xab,0x4d,0x0e,0x22,0x70,0x7f,0x8d,0x12,0x94,0x4c,0xb2,0x22,0x08};
     uint16_t pubkeylen=32;
     //公钥数据-32位
     uint8_t pubkey[32]={0x6c,0x89,0xdf,0xc3,0xfc,0x0c,0xc6,0xdb,0x14,0xc5,0xdd,0xeb,0xcd,0x0a,0x6f,0x61,0x99,0xf9,0x85,0xe2,0x70,0x15,0x37,0x04,0x2c,0x30,0xb8,0x43,0x2c,0x34,0xc7,0xf7};
     //明文数据
     unsigned char msg[] = "\x61\x62\x63\x31\x32\x33\x34\x35\x36\x39\x38\x37\x64\x65\x66\x71\x77\x65\x72\x74\x79\x75\x69\x6f\x70\x6c\x6b\x6a\x68\x67\x66\x64\x73\x61\x6d\x6e\x62\x76\x63\x78\x7a";
   unsigned int msglen = sizeof(msg) - 1;
     int ret=0;
    
   EVP_MD_CTX *mdctx = NULL;
      EVP_PKEY *pkey = NULL;

     pkey = EVP_PKEY_new();
     if(pkey == NULL)
    {
        printf("EVP_PKEY_new is failed.\n");
           return -1;
    }
    //设置公钥数据到EVP_PKEY结构
      pkey = EVP_PKEY_new_raw_public_key(NID_ED25519,NULL,pubkey,pubkeylen);
      if(pkey == NULL){
        printf("EVP_MD_CTX_create is failed.\n");
        return -2;
     }
    //此处需用EVP_MD_CTX_new
    mdctx = EVP_MD_CTX_new();
    if (mdctx == NULL)
    {
        printf("EVP_MD_CTX_create is failed.\n");
              EVP_PKEY_free(pkey);
        return -3;
    }
        //摘要类型参数必须设置为NULL
    if (EVP_DigestVerifyInit(mdctx, NULL, NULL, NULL,pkey)<=0)
    {
        printf("EVP_DigestVerifyInit is failed.\n");
              EVP_PKEY_free(pkey);
              EVP_MD_CTX_free(mdctx);
        return -4;
    }
    ret=EVP_DigestVerify(mdctx, buf, 64, msg, msglen);
    if(ret!=1){
                printf("EVP_DigestVerifyFinal is failed. ret=[%d]\n",ret);
               EVP_MD_CTX_free(mdctx);
               return -1;
     }else{
                printf("EVP_DigestVerifyFinal is succ. ret=[%d]\n",ret);
                EVP_MD_CTX_free(mdctx);
                return 0;
    } 
    if (pkey != NULL){
        EVP_PKEY_free(pkey);
     }
    EVP_MD_CTX_free(mdctx);
    return 0;
}
int main(int argc,char *argv[])
{

        int ret;
    ret = ed25519_test();
    if (ret < 0)
    {
        printf("rsa_sign_test is failed.\n");
    }
    else
    {
        printf("rsa_sign_test successed.\n");
    }
        return 0;
}
 

参考引用:https://www.openssl.org/docs/man1.1.1/man3/

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值