openssl 生成摘要、签名和验签接口使用

这段代码展示了如何使用OpenSSL库进行哈希计算、数据签名及验签操作。首先,`getDigest`函数计算输入数据的SHA256摘要;接着,`signData`函数使用私钥对数据进行签名;最后,`verify`函数验证用公钥签署的数据签名是否有效。在主函数中,私钥和公钥从文件读取,然后对字符串进行签名和验证。
摘要由CSDN通过智能技术生成

1、生成摘要

int getDigest(const char* source, int source_len, unsigned char *digest_data, unsigned int *digest_len)
{
	EVP_MD_CTX *mdctx;
	if((mdctx = EVP_MD_CTX_create()) == NULL) {
		return -1;
	}
    
	if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL)) {
		return -1;
	}

	if(1 != EVP_DigestUpdate(mdctx, source, source_len)) {
		return -1;
	}
    
	if(1 != EVP_DigestFinal_ex(mdctx, digest_data, digest_len)) {
		return -1;
	}
   
	EVP_MD_CTX_destroy(mdctx);
	
	return 0;
}


2、签名

int signData(EVP_PKEY * key, unsigned char *data, unsigned int data_len, 
                     unsigned char *sign, unsigned int *sign_len)
{
    EVP_MD_CTX *ctx = EVP_MD_CTX_create();
	const EVP_MD* digestAlg = EVP_sha256();
    
	if(1 != EVP_SignInit(ctx, digestAlg))
		goto err_exit;  

	if(1 != EVP_SignUpdate(ctx, data, data_len))
		goto err_exit;

	if(1 != EVP_SignFinal(ctx, sign, sign_len, key))
		goto err_exit;

    EVP_MD_CTX_free(ctx);

    return 0;
err_exit:
    EVP_MD_CTX_free(ctx);
    return -1;
    
}

3、验签

int verify(EVP_PKEY * key, unsigned char * sign_data, unsigned int sign_data_len, 
            unsigned char * original, unsigned int original_len)
{
    EVP_MD_CTX *ctx = EVP_MD_CTX_create();
	const EVP_MD* digestAlg = EVP_sha256();

	if(1 != EVP_VerifyInit(ctx, digestAlg))
		goto err_exit; 

	if(1 != EVP_VerifyUpdate(ctx, original, original_len))
		goto err_exit;    

	if(1 != EVP_VerifyFinal(ctx, sign_data, sign_data_len, key))
		goto err_exit; 

	EVP_MD_CTX_free(ctx);

    return 0;
err_exit:
    EVP_MD_CTX_free(ctx);
    return -1;
}

二、demo

int main(void)
{	
    FILE *sfd = fopen("/home/opensslapi/pfx_pri.pem", "r");
    FILE *pfd = fopen("/home/opensslapi/pfx_pub.pem", "r");
    EVP_PKEY *sk = PEM_read_PrivateKey(sfd, NULL, NULL, NULL);
    EVP_PKEY *pk = PEM_read_PUBKEY(pfd, NULL, NULL, NULL);

    fclose(sfd);
    fclose(pfd);

	char src_data[64] = "123qwet";
    unsigned int sign_len = 0, digest_len = 0;
    unsigned char sign[512] = {0};
    unsigned char hash_str[512] = {0};


	getDigest(src_data, strlen(src_data), hash_src, &digest_len);

    signData(sk, src_data, strlen(src_data), sign, &sign_len);
    
    if(0 == verify(pk, sign, sign_len, src_data, strlen(src_data)))
        printf("verify success\n");
    else
        printf("verify failed\n");

	EVP_PKEY_free(sk);
	EVP_PKEY_free(pk);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值