在VS中编译openssl进行RSA加密解密


RSA算法原理:http://blog.csdn.net/q376420785/article/details/8557266

下载安装编译Openssl:http://blog.csdn.net/fengyunzhongwei/article/details/44570917

使用Openssl命令台指令生成密钥:http://www.cnblogs.com/aLittleBitCool/archive/2011/09/22/2185418.html

---------------------------------------------------------------------------------------------------------------------------------------------------------

Openssl已经编译成功,如何在VS中调用Openssl的库函数:

1、创建一个项目,命名为RSA

2、添加头文件路径

点击菜单中“项目-->属性-->C/C++” 在   附加包含目录   中添加编译Openssl后生成的文件的头文件所在路径


3、添加库文件

点击菜单中“项目-->属性-->连接-->常规” 在   附加目录  添加生成的lib和dll文件所在的路径


添加完后还得在代码中调用静态链接库

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

---------------------------------------------------------------------------------------------------------------------------------------------

以下用C语言编程实现利用Openssl完成RSA加解密:

<pre name="code" class="plain">#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<openssl/err.h>
#include <openssl/applink.c>

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

#define OPENSSLKEY "test.key"    //文件为Openssl生成的密钥名字,得放在工程目录下
#define PUBLICKEY "test_pub.key"
#define BUFFSIZE 1024

//extern "C"
//{
//#include <openssl/applink.c>
//};
char* my_encrypt(char *str, char *path_key);//加密
char* my_decrypt(char *str, char *path_key);//解密
int main(void) {
	char *source = "i like dancing !";
	char *ptr_en, *ptr_de;
	printf("source is    :%s\n", source);
	ptr_en = my_encrypt(source, PUBLICKEY);
	printf("after encrypt:%s\n", ptr_en);
	ptr_de = my_decrypt(ptr_en, OPENSSLKEY);
	printf("after decrypt:%s\n", ptr_de);
	if (ptr_en != NULL) {
		free(ptr_en);
	}
	if (ptr_de != NULL) {
		free(ptr_de);
	}
	return 0;
}
char *my_encrypt(char *str, char *path_key) {
	errno_t err;
	char *p_en;
	RSA *p_rsa;
	FILE *file;
	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) {
		//if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL){  // 换成这句死活通不过,无论是否将公钥分离源文件
		ERR_print_errors_fp(stdout);
		return NULL;
	}
	flen = strlen(str);
	rsa_len = RSA_size(p_rsa);
	p_en = ( char *)malloc(rsa_len + 1);
	memset(p_en, 0, rsa_len + 1);
	if (RSA_public_encrypt(rsa_len, (unsigned char *)str, (unsigned char*)p_en, p_rsa, RSA_NO_PADDING)<0) {
		return NULL;
	}
	RSA_free(p_rsa);
	fclose(file);
	return p_en;
}
char *my_decrypt(char *str, char *path_key) {
	errno_t err;
	char *p_de;
	RSA *p_rsa;
	FILE *file;
	int rsa_len;
	if (( err= fopen_s(&file,path_key, "r"))!=0) {
		perror("open key file error");
		return NULL;
	}
	if ((p_rsa = PEM_read_RSAPrivateKey(file, NULL, NULL, NULL)) == NULL) {
		ERR_print_errors_fp(stdout);
		return NULL;
	}
	rsa_len = RSA_size(p_rsa);
	p_de = ( char *)malloc(rsa_len + 1);
	memset(p_de, 0, rsa_len + 1);
	if (RSA_private_decrypt(rsa_len, (unsigned char *)str, (unsigned char*)p_de, p_rsa, RSA_NO_PADDING)<0) {
		return NULL;
	}
	RSA_free(p_rsa);
	fclose(file);
	return p_de;
}

 

报错:OPENSSL_Uplink(0F5D2000,08): no OPENSSL_Applink

解决方法:用ssl库的时候要引入这个头文件:#include <openssl/applink.c>




fopen和fopen_s用法比较

             在定义FILE * fp 之后,fopen的用法是: fp = fopen(filename,"w")。而对于fopen_s来说,还得定义另外一个变量errno_t err,然后err = fopen_s(&fp,filename,"w")。返回值的话,对于fopen来说,打开文件成功的话返回文件指针(赋值给fp),打开失败则返回NULL值;对于fopen_s来说,打开文件成功返回0,失败返回非0。

              在vs编程中,经常会有这样的警告:warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use_CRT_SECURE_NO_WARNINGS. See online help for details.  是因为  fopen_s比fopen多了溢出检测,更安全一些。


  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 OpenSSL 库编写 RSA 加解密算法和 RSA 签名验证算法的示例代码,使用的是 C 语言: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/err.h> int main() { RSA *rsa = NULL; unsigned char *data = (unsigned char *)"Hello, world!"; unsigned char encrypted[2048] = {0}; unsigned char decrypted[2048] = {0}; unsigned char sig[2048] = {0}; unsigned int sig_len = 0; int ret = 0; // 生成 RSA 密钥对 rsa = RSA_new(); BIGNUM *e = BN_new(); int bits = 2048; unsigned long exponent = RSA_F4; BN_set_word(e, exponent); RSA_generate_key_ex(rsa, bits, e, NULL); // RSA 加密 int data_len = strlen((const char *)data); int len = RSA_public_encrypt(data_len, data, encrypted, rsa, RSA_PKCS1_PADDING); if (len < 0) { printf("RSA encryption failed\n"); return -1; } // RSA 解密 len = RSA_private_decrypt(len, encrypted, decrypted, rsa, RSA_PKCS1_PADDING); if (len < 0) { printf("RSA decryption failed\n"); return -1; } printf("Decrypted data: %s\n", decrypted); // RSA 签名 ret = RSA_sign(NID_sha256, data, data_len, sig, &sig_len, rsa); if (ret != 1) { printf("RSA signature failed\n"); return -1; } // RSA 验证签名 ret = RSA_verify(NID_sha256, data, data_len, sig, sig_len, rsa); if (ret != 1) { printf("RSA signature verification failed\n"); return -1; } printf("RSA signature verification succeeded\n"); RSA_free(rsa); return 0; } ``` 需要注意的是,在实际使用时需要根据具体情况进行修改和完善,例如读取密钥文件、处理加密后的数据、处理签名数据等。另外,需要链接 OpenSSL 库,可以使用以下命令进行编译: ```sh gcc -o rsa rsa.c -lssl -lcrypto ``` 其,`-lssl` 表示链接 OpenSSL 的 SSL 库,`-lcrypto` 表示链接 OpenSSL 的 Crypto 库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值