vc++ openssl 程序签名

RSA一般有两种应用场景:
   1、公钥加密、私钥解密:这是数据安全通信领域最常见情形;
   2、私钥加验、公钥验签:这主要用于数字签名。

我们这里用到的是第二种情况:

这里是基于OpenSSL,首先安装OpenSSL工具,引用lib、.h文件,网上有很多例子这里就不在介绍

头文件:

#pragma once
#include <stdio.h>
#include<string.h>
#include <openssl/bio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
class test4
{
public:
    test4(void);
    ~test4(void);
    void print_hex(char* buff);
    int rsa_verify(char *in, char *key_path, char* in2, int len);
    int rsa_sign(char *in, char *key_path, char* out, int* plen);
    int test();
};

cpp文件

#include "StdAfx.h"
#include "test4.h"
#include <stdio.h>
#include<string.h>
#include <openssl/bio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#define MSG_LEN (128+1)
test4::test4(void)
{
}

test4::~test4(void)
{
}
void test4::print_hex(char* buff)
{
    for (int i=0;buff[i];i++)
        printf("%02x",(unsigned char)buff[i]);
    printf("\n");
}
int test4::rsa_verify(char *in, char *key_path, char* in2, int len)
{
    RSA *p_rsa;
    FILE *file;
    if((file=fopen(key_path,"r"))==NULL)
    {
        perror("open key file error");
        return 0;
    }
    if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL)
    //if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL)
    {
        ERR_print_errors_fp(stdout);
        return 0;
    }
    if(!RSA_verify(NID_md5,(unsigned char*)in,strlen(in),(unsigned char*)in2,len,p_rsa))
    {
        return 0;
    }
    RSA_free(p_rsa);
    fclose(file);
    return 1;
}
int test4::rsa_sign(char *in, char *key_path, char* out, int* plen)
{
    RSA *p_rsa;
    FILE *file;
    if((file=fopen(key_path,"r"))==NULL)
    {
        perror("open key file error");
        return 0;
    }
    if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL)
    {
        ERR_print_errors_fp(stdout);
        return 0;
    }
    if(!RSA_sign(NID_md5,(unsigned char*)in,strlen(in),(unsigned char*)out,(unsigned int*)plen,p_rsa))
    {
        return 0;
    }
    RSA_free(p_rsa);
    fclose(file);
    return 1;
}
int test4::test()
{
    char text[MSG_LEN];
    char sign[MSG_LEN];
    int len=0;

    memset((char*)text, 0 ,MSG_LEN);
    memset((char*)sign, 0 ,MSG_LEN);

    strcpy((char*)text, "123456789 123456789 123456789 12a");
    char pubkey[]="c:\\rsa_public_key.pem";
    char prikey[]="c:\\rsa_private_key.pem";
    if(!rsa_sign(text,prikey,sign,&len))
    {
        printf("sign error\n");
        return -1;
    }
    printf("sign %d:",strlen((char*)sign));
    print_hex(sign);
    if(!rsa_verify(text,pubkey,sign,len))
    {
        MessageBox(NULL,_T("verify error"),_T("111"),1);
        printf("verify error\n");
        return -1;
    }
    printf("verify ok\n");
    MessageBox(NULL,_T("verify ok"),_T("111"),1);
    return 0;
}

调用test()方法,提示"verify ok "代表成功。

 

转载于:https://www.cnblogs.com/lvlv/p/8850219.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenSSL是一个开源的密码学工具库,它提供了一系列的加密、解密、签名、验证等功能。在C++中使用OpenSSL进行签名操作,可以通过以下步骤实现: 1. 引入OpenSSL库:在C++代码中引入OpenSSL库,可以使用`#include <openssl/evp.h>`来包含OpenSSL的头文件。 2. 初始化OpenSSL:在使用OpenSSL之前,需要进行初始化操作。可以通过调用`OpenSSL_add_all_algorithms()`函数来初始化OpenSSL。 3. 创建密钥对:签名操作需要使用密钥对,包括私钥和公钥。可以使用OpenSSL提供的函数生成密钥对,例如`EVP_PKEY_generate()`函数。 4. 加载私钥:将生成的私钥加载到内存中,可以使用`PEM_read_PrivateKey()`函数从文件中加载私钥。 5. 创建签名上下文:使用`EVP_MD_CTX_new()`函数创建签名上下文。 6. 设置签名算法:使用`EVP_get_digestbyname()`函数获取指定的签名算法,例如SHA256,然后使用`EVP_DigestSignInit()`函数初始化签名上下文。 7. 添加待签名数据:使用`EVP_DigestSignUpdate()`函数向签名上下文添加待签名的数据。 8. 进行签名:使用`EVP_DigestSignFinal()`函数进行签名操作,将签名结果保存到缓冲区中。 9. 验证签名:如果需要验证签名,可以使用公钥和签名结果进行验证。可以使用`PEM_read_PUBKEY()`函数加载公钥,然后使用`EVP_DigestVerifyInit()`、`EVP_DigestVerifyUpdate()`和`EVP_DigestVerifyFinal()`函数进行签名验证。 以上是使用OpenSSL进行C++签名的基本步骤,具体的实现可以根据具体需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值