windows下vc调用openssl实现RSA加密

     拿到了linux下c实现的RSA调用源码,想在windows下编程实现相同的结果,查了查资料,在vc6和vs2010调试通过,在win7 x64和winXP 32 运行结果一致,记录下来,以备日后查找。

一、安装openssl

1、进入Win32 OpenSSL下载页面,选择适合自己的版本进行下载。建议选择win32版本,程序通用性强,选择非light版本。

2、安装,有个lib位置选项,选在system那个选项比较好。

二、修改工程属性

1、vc6.0:include和lib包含目录中添加openssl安装文件夹下的include和lib

2、vs2010:配置属性--VC++目录--包含目录,添加openssl下的include文件夹

                    链接器--常规--附加库目录,添加openssl下的lib和bin

三、调试源码

因为我只需要加密结果,以便对照linux结果是否一致,所以没有写解密

#include
#include
#include
#include
#include
#include
#include 

#pragma comment(lib, "libeay32.lib")

#define PUBLICKEY "test.pub"   //公钥文件
#define BUFFSIZE 1024

char* my_encrypt(char *str, char *path_key);//加密

int main(void) {
	char *source = "12345678";
	char *ptr_en;
	printf("source is    :%s\n", source);
	ptr_en = my_encrypt(source, PUBLICKEY);

	if (ptr_en != NULL) {
		free(ptr_en);
	}
	return 0;
}
char *my_encrypt(char *str, char *path_key) {
	errno_t err;
	char *p_en;
	RSA *p_rsa;
	FILE *file,*frsa;
	int flen, rsa_len;


	if ((err = fopen_s(&file, path_key, "r")) != 0) {
		perror("open key file error");
		return NULL;
	}
	
	if ((p_rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL)) == NULL) {
		ERR_print_errors_fp(stdout);
		return NULL;
	}
	rsa_len = RSA_size(p_rsa);
	p_en = ( char *)malloc(rsa_len +1);
	memset(p_en, 0, rsa_len +1);
	if (RSA_public_encrypt(strlen(str), (unsigned char *)str, (unsigned char*)p_en, p_rsa, RSA_PKCS1_PADDING)<0) {
		return NULL;
	}
	err=fopen_s(&frsa,"ps_rsa","wb");
	fwrite((void *)p_en,1,rsa_len,frsa);
	printf("rsa_len:%d\n",rsa_len);
	fclose(frsa);
	RSA_free(p_rsa);
	fclose(file);
	return p_en;
}

四、注意事项

1、公钥文件读取函数的选择

网上查的资料,公钥文件有两种格式,对应两个函数

PEM公钥格式文件

1

2

-----BEGIN PUBLIC KEY-----

-----END PUBLIC KEY-----

上面这种格式,使用函数  PEM_read_RSA_PUBKEY

 PEM RSAPublicKey公钥格式文件

1

2

-----BEGIN RSA PUBLIC KEY-----

-----END RSA PUBLIC KEY-----

这种格式,使用函数   PEM_read_RSAPublicKey

2、这里使用的 RSA_PKCS1_PADDING 方式,这种方式在输入信息不够一块时,会随机填充,因此每次加密,即使明文相同,密文也会不同,解密时算法会使用相同的填充方式填充,实现解密。

另外,这种加密参数,明文长度要求小于  块长-11,第一个参数是明文的实际长度。

 

你可能感兴趣的:(windows下vc调用openssl实现RSA加密)