vs2012基于openssl实现对文件中数据的签名与验证

在做这个之前,先要添加openssl的库文件和lib,这个方法参考我的上一篇文章.

3.txt要放到工程目录下

#include<stdio.h>

#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<openssl/evp.h>
#include<openssl/x509.h>//证书操作函数
void tsign()
{
    FILE *fp;
    unsigned char sign_value[1024];                //保存签名值的数组
    unsigned int sign_len;                         //签名值长度
    EVP_MD_CTX mdctx;                              //摘要算法上下文变量
    char mess[200];
    if((fp=fopen("3.txt","r"))==NULL) exit(0);
    fscanf(fp,"%s",mess);
    fclose(fp);
    printf("\n从文件读取的数据为:%s\n",mess);
    RSA*rsa=NULL;                                  //RSA结构体变量
    EVP_PKEY *evpKey=NULL;                         //EVP KEY结构体变量
    int i;
    printf("正在生成RSA密钥...\n");
    rsa=RSA_generate_key(1024,RSA_F4,NULL,NULL);   //产生一个1024位的RSA密钥
    if(rsa==NULL)
    {
        printf("生成rsa密钥失败\n");
        return;
    }
    printf("生成RSA秘钥成功.\n");
    evpKey=EVP_PKEY_new();                         //新建一个EVP_PKEY变量
    if(evpKey==NULL)
    {
        printf("EVP_PKEY_new err\n");
        RSA_free(rsa);
        return ;
    }
    if(EVP_PKEY_set1_RSA(evpKey,rsa)!=1)           //保存RSA结构体到EVP_PKEY结构体
    {
        printf("EVP_PKEY_set1_RSA err\n");
        RSA_free(rsa);
        EVP_PKEY_free(evpKey);
        return;
    }
    EVP_MD_CTX_init(&mdctx);                        //初始化摘要上下文
    if(!EVP_SignInit_ex(&mdctx,EVP_md5(),NULL))     //签名初始化,设置摘要算法,摘要算法引擎
    {                                               //EVP_MD_CTX结构体,MD5摘要算法
        printf("err\n");                            //NULL表示使用默认引擎
        EVP_PKEY_free(evpKey);
        RSA_free(rsa);
        return;
    }
    if(!EVP_SignUpdate(&mdctx,mess,strlen(mess)))        //计算签名(摘要)Update
    {                                                    //计算数据摘要,类型数据,摘要长度
        printf("err\n");                                  
        EVP_PKEY_free(evpKey);                              
        RSA_free(rsa);
        return;
    }
    if(!EVP_SignFinal(&mdctx,sign_value,&sign_len,evpKey))  //签名输出
    {                                                       //签名结束,第二个参数,签名结果输出值的指针
        printf("err\n");                                    //第三个变量,签名的长度
        EVP_PKEY_free(evpKey);                              //第四个变量签名的私钥  
        RSA_free(rsa);
        return;
    }
    printf("消息\"%s\"的签名值是:\n",mess);
    for(i=0;i<sign_len;i++)
    {
        if(i%16==0)
            printf("\n%08xH:",i);
        printf("%02x",sign_value[i]);
    }
    printf("\n");
    EVP_MD_CTX_cleanup(&mdctx);
    printf("\n正在验证签名...\n");
    //验证签名代码
    EVP_MD_CTX_init(&mdctx);                       //初始化摘要上下文
    if(!EVP_VerifyInit_ex(&mdctx,EVP_md5(),NULL))  //验证初始化,设置摘要算法一定要和签名一致
    {
        printf("EVP_VerifyInit_ex err\n");
        EVP_PKEY_free(evpKey);
        RSA_free(rsa);
        return ;
    }
    if(!EVP_VerifyUpdate(&mdctx,mess,strlen(mess))) //验证签名摘要值Update
    {
        printf("err\n");
        EVP_PKEY_free(evpKey);
        RSA_free(rsa);
        return;
    }
    if(!EVP_VerifyFinal(&mdctx,sign_value,sign_len,evpKey)) //验证签名
    {
        printf("verify err\n");
        EVP_PKEY_free(evpKey);
        RSA_free(rsa);
        return;
    }
    else
    {
        printf("验证签名正确.\n");
    }
    //释放内存
    EVP_PKEY_free(evpKey);
    RSA_free(rsa);
    EVP_MD_CTX_cleanup(&mdctx);
    return ;
}
int main()
{
    OpenSSL_add_all_algorithms();    //加载加密算法函数和单向散列算法函数
    tsign();
    return 0;

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于OpenSSL文件安全传输系统的设计与实现需要考虑以下几个方面。 首先,系统需要使用OpenSSL提供的加密算法来保证文件的安全性。OpenSSL支持的加密算法包括对称加密算法(如AES)和非对称加密算法(如RSA),我们可以根据具体的需求选择适当的加密算法来保护传输的文件。 其次,系统需要使用OpenSSL的SSL/TLS协议来建立安全的传输通道。SSL/TLS协议能够提供端到端的加密和身份验证保护,确保传输过程数据的机密性和完整性,并防止间人攻击。通过OpenSSL提供的API,我们可以实现SSL/TLS协议的握手过程,确保双方能够安全地进行文件传输。 另外,系统还需要考虑到数字证书的使用,以提供对通信双方身份的验证和认证。我们可以使用OpenSSL生成自签名证书来进行实验和测试,也可以使用CA签发的证书来进行正式的身份验证。 在实现方面,系统可以基于OpenSSL的C/C++ API来开发。首先,需要编写服务器端程序和客户端程序来进行文件传输。这些程序需要处理OpenSSL的API调用,建立SSL/TLS连接,进行身份验证,然后进行文件的加密和解密操作。同时,还需要处理传输过程可能出现的错误和异常情况,并提供相应的错误处理机制。 总结起来,基于OpenSSL文件安全传输系统的设计与实现需要考虑加密算法的选择、SSL/TLS协议的运用、数字证书的使用,并针对具体的需求进行程序的编写和错误处理。通过合理地利用OpenSSL提供的功能和API,可以实现一个安全可靠的文件传输系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值