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 程序签名的更多相关文章
-
Android 应用程序签名
本文主要介绍Android应用程序签名的相关理论知识以及怎样公布Android应用程序. 1.签名的概念 为大家所熟知的日常生活中的签名,它是代表某个人的特殊标记,用于唯一标识某个人.而Android ...
-
IONIC 开发的Android应用程序签名(或重新签名)详解
完全通过DOS命令来完成apk签名 给apk签名一共要用到3个工具,或者说3个命令,分别是:keytool.jarsigner和zipalign,下面是对这3个工具的简单介绍: ...
-
Android对应用程序签名
1.首先签名是个什么东西. 应用程序签名就是为你的程序打上一种标记,来作为你自己的标识. 2.为什么要进行数字签名 这是Android系统的要求,每一个应用程序必要要经过数字签名才可能安装到系统中,能 ...
-
Android应用程序签名详解 简介
转自: http://blog.csdn.net/lyq8479/article/details/6401093 本文主要讲解Android应用程序签名相关的理论知识,包括:什么是签名.为什么要给应用 ...
-
android利用数字证书对程序签名
签名的必要性 1. 防止你已安装的应用被恶意的第三方覆盖或替换掉. 2. 开发者的身份标识,签名可以防止抵赖等事件的发生. 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同 ...
-
【转】android应用程序签名
概述 Android系统要求,所有的程序经过数字签名后才能安装.Android系统使用这个证书来识别应用程序的作者,并且建立程序间的信任关系.证书不是用于用户控制哪些程序可以安装.证书不需要授权中心来 ...
-
3、Android应用程序签名及发布
一.问个问题,为何我们需要签名以及版本控制? 程序做好了,我们要放到Market上进行商业发布. 二.发布步骤 [准备发布] 1)移除log , 设置版本编号和名称. 2)签名,通过ADT工具. 3) ...
-
android 利用数字证书对程序签名
签名的必要性 1. 防止你已安装的应用被恶意的第三方覆盖或替换掉. 2. 开发者的身份标识,签名可以防止抵赖等事件的发生. 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样 ...
-
Android JNI 获取应用程序签名
使用Android JNI 获取应用程序签名. 获取基础上生成自己的签名password,这可以防止别人反编译找到自己的源代码password. jstring Java_com_masonsdk_j ...
随机推荐
-
python 面试必读
总结了10道题的考试侧重点,供参考: 1.How are arguments passed – by reference of by value? 考的是语法,基本功,虽说python程序员可以不用关 ...
-
(转载)CSV 文件处理 PERL
http://cn.perlmaven.com/how-to-read-a-csv-file-using-perl http://search.cpan.org/~hmbrand/Text-CSV_X ...
-
POJ 1401
#include<iostream>using namespace std;int main(){ int num; int i; int sum; cin> ...
-
View的事件分发机制
一.点击事件的传递规则 传递事件的主要方法: public boolean dispatchTouchEvent(MotionEvent ev) 如果事件能够传递到当前View,则该方法一定会被调用. ...
-
利用ScktSrvr打造多功能Socket服务器
Socket服务端编程中最重要的也是最难处理的工作便是客户请求的处理和数据的接收和发送,如果每一个Socket服务器应用程序的开发都要从头到尾处理这些事情的话,人将会很累,也会浪费大量时间.试想,如果 ...
-
CentOS7下一个mysql安装
CentOS7安装MySQL --下载mysql http://mirrors.sohu.com/mysql/MySQL-5.6/ http://mirrors.sohu.com/mysql/MySQ ...
-
转:【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17290021 在http://blog.csdn.net/ns_code/article/ ...
-
炫酷:一句代码实现标题栏、导航栏滑动隐藏。ByeBurger库的使用和实现
本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发. 其实上周五的时候已经发过一篇文章.基本实现了底部导航栏隐藏的效果.但是使用起来可能不是很实用.因为之前我实现的方式是继承了系统的 ...
-
Shell - 简明Shell入门15 - 调试(Debug)
示例脚本及注释 #!/bin/bash -x for filename in t1 t2 t3 do touch $filename.txt echo "Create new file: $ ...
-
struts请求参数注入的三种方式
.请求参数的注入 在Struts2框架中,表单的提交的数据会自动注入到与Action对象相对应的属性.它与Spring框架中的IoC的注入原理相同,通过Action对象为属性提供setter方法注入 ...