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=;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 ;
}
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 ;
}
if(!RSA_verify(NID_md5,(unsigned char*)in,strlen(in),(unsigned char*)in2,len,p_rsa))
{
return ;
}
RSA_free(p_rsa);
fclose(file);
return ;
}
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 ;
}
if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL)
{
ERR_print_errors_fp(stdout);
return ;
}
if(!RSA_sign(NID_md5,(unsigned char*)in,strlen(in),(unsigned char*)out,(unsigned int*)plen,p_rsa))
{
return ;
}
RSA_free(p_rsa);
fclose(file);
return ;
}
int test4::test()
{
char text[MSG_LEN];
char sign[MSG_LEN];
int len=; memset((char*)text, ,MSG_LEN);
memset((char*)sign, ,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 -;
}
printf("sign %d:",strlen((char*)sign));
print_hex(sign);
if(!rsa_verify(text,pubkey,sign,len))
{
MessageBox(NULL,_T("verify error"),_T(""),);
printf("verify error\n");
return -;
}
printf("verify ok\n");
MessageBox(NULL,_T("verify ok"),_T(""),);
return ;
}

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

vc++ openssl 程序签名的更多相关文章

  1. Android 应用程序签名

    本文主要介绍Android应用程序签名的相关理论知识以及怎样公布Android应用程序. 1.签名的概念 为大家所熟知的日常生活中的签名,它是代表某个人的特殊标记,用于唯一标识某个人.而Android ...

  2. IONIC 开发的Android应用程序签名(或重新签名)详解

    完全通过DOS命令来完成apk签名 给apk签名一共要用到3个工具,或者说3个命令,分别是:keytool.jarsigner和zipalign,下面是对这3个工具的简单介绍:            ...

  3. Android对应用程序签名

    1.首先签名是个什么东西. 应用程序签名就是为你的程序打上一种标记,来作为你自己的标识. 2.为什么要进行数字签名 这是Android系统的要求,每一个应用程序必要要经过数字签名才可能安装到系统中,能 ...

  4. Android应用程序签名详解 简介

    转自: http://blog.csdn.net/lyq8479/article/details/6401093 本文主要讲解Android应用程序签名相关的理论知识,包括:什么是签名.为什么要给应用 ...

  5. android利用数字证书对程序签名

     签名的必要性 1.  防止你已安装的应用被恶意的第三方覆盖或替换掉. 2.  开发者的身份标识,签名可以防止抵赖等事件的发生. 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同 ...

  6. 【转】android应用程序签名

    概述 Android系统要求,所有的程序经过数字签名后才能安装.Android系统使用这个证书来识别应用程序的作者,并且建立程序间的信任关系.证书不是用于用户控制哪些程序可以安装.证书不需要授权中心来 ...

  7. 3、Android应用程序签名及发布

    一.问个问题,为何我们需要签名以及版本控制? 程序做好了,我们要放到Market上进行商业发布. 二.发布步骤 [准备发布] 1)移除log , 设置版本编号和名称. 2)签名,通过ADT工具. 3) ...

  8. android 利用数字证书对程序签名

    签名的必要性 1.  防止你已安装的应用被恶意的第三方覆盖或替换掉. 2.  开发者的身份标识,签名可以防止抵赖等事件的发生. 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样 ...

  9. Android JNI 获取应用程序签名

    使用Android JNI 获取应用程序签名. 获取基础上生成自己的签名password,这可以防止别人反编译找到自己的源代码password. jstring Java_com_masonsdk_j ...

随机推荐

  1. 给idea添加类注释和方法注释模板

    这是我找到的最好的,最简单明白的一文: https://blog.csdn.net/xiaoliulang0324/article/details/79030752

  2. git 一个分支完全覆盖另一个分支

    1,git push origin develop:master -f就可以把本地的develop分支强制(-f)推送到远程master 2,git checkout master // 切换到旧的分 ...

  3. pytorch下的lib库 源码阅读笔记(1)

    置顶:将pytorch clone到本地,查看initial commit,已经是麻雀虽小五脏俱全了,非常适合作为学习模板. 2017年12月7日01:24:15 2017-10-25 17:51 参 ...

  4. 用网站把图标做成iconFont文件引用

    1,把psd文件另存为eps文件(ai能打开的格式),前提图标有路径, 2,用ai打开eps文件 3,新建一个空白文件100*100,然后把图标复制进来,等比拉宽至最大化 4,如果图标有蒙版,就点击图 ...

  5. 简单的知识图谱,neo4j+python

    因为研究方向是知识图谱,就有兴致想要构建一个简单的知识图谱,就在网上查找了一下,参考了neo4j搭建简单的金融知识图谱的思想,就着手从零开始构建. 1.首先就要考虑数据的获得,因为之前没有接触过爬虫之 ...

  6. postgresql数据库备份

    一.工具备份数据 打开windows下的命令窗口:开始->cmd->安装数据库的目录->进入bin目录: 导出命令:pg_dump –h localhost –U postgres ...

  7. requests_html 使用

    安装 pip install requests-html #2种方式爬取 博客园from requests_html import HTMLSession session=HTMLSession() ...

  8. python-web自动化-元素定位

    # -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By # ...

  9. element-ui table 嵌套

    嵌套的时时候用template,数据 scope.row.xxx <template> <div> <el-table :data="urls" st ...

  10. ---mingw Linux交叉编译给Window的工具

    https://arrayfire.com/cross-compile-to-windows-from-linux/