C/C++ Openssl API RSA加解密文件

生成私钥 openssl genrsa -out prikey.pem 1024
生成公钥 openssl rsa -pubout -in prikey.pem -out pubkey.pem

#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
 
const char *publicKey = "-----BEGIN PUBLIC KEY-----\n\
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcFzwk3q/VNKjCloHn+ClRF7el\n\
sfsJIVkzCkqK62ufPyThsIEW6UlEIrA6wVY3lwG84wmknHesWnhOntLZNI5QrPgn\n\
1FOL4fVJtaeWq1azoHwejtPD0QNM03CKIuvxV5MV7hh9QXirfb7ac6zMVsQ4vf4w\n\
swiTBdt8l1JFIXj0dQIDAQAB\n\
-----END PUBLIC KEY-----";
 
const char *privateKey = "-----BEGIN RSA PRIVATE KEY-----\n\
MIICXQIBAAKBgQCcFzwk3q/VNKjCloHn+ClRF7elsfsJIVkzCkqK62ufPyThsIEW\n\
6UlEIrA6wVY3lwG84wmknHesWnhOntLZNI5QrPgn1FOL4fVJtaeWq1azoHwejtPD\n\
0QNM03CKIuvxV5MV7hh9QXirfb7ac6zMVsQ4vf4wswiTBdt8l1JFIXj0dQIDAQAB\n\
AoGAbdhMEwZDZx7vxEB2mvAg41h1fL2LlBlL1IdhffG+gwrEwa6cqaryTGi87Bwy\n\
uFwkdPCxUI5sCXaBQ5KxfvllTHeMZKfOlDy0vwpOP4g0UJoJRp/GaEee4zZVjJgN\n\
WRrjQXobOLSnEJRrjQkKW9gmrrs5kSLu041HpI3IqKetHgECQQDKriYVw6t96sXD\n\
0Wib5eksQB5uG96/S8000TrWpVZ8BgwRei+u1TCplXuLYyTWGv3RIJITrNCAefFJ\n\
uy1gezYxAkEAxSdviW9CmTCBjVEV0sLCeFqMT7dck5BzM44yfekrIY4JHxzBYlOF\n\
J+6/MsKAAwXSmu9m9Pkki+QWWiwsC6ZdhQJBALQAjlpt+PRPeWw7osgyHC/skhoA\n\
Lod+brUlzTesh26GgFlVRtvjAuDZnWthlemA90KvxowqwtIXeq+cyOQTCUECQHIm\n\
QB0JzzyU6h2hOgp6e1Bl1OF+39oMg7bw+OkP7MoTy9I4uvssMmeJgyhnluipIWRV\n\
gn4KFo/scsio1KO2ImUCQQC41CzCihfolvlSCE4Q1YtCYf63iGnpTm95DvmDCskS\n\
vIphhmeN3XFciq7w78LbLJTpn9AB66TtYnRWegSoGcho\n\
-----END RSA PRIVATE KEY-----";
 
static void inner_encryptFile(const char *srcFilename, RSA *pubKey, const char *enFilename)
{
	FILE *fpSrc;
	FILE *fpTgt;
	size_t readLen;
	char *sBuf;
	char *dBuf;
	size_t sBufLen;
	size_t dBufLen;
	
	dBufLen = RSA_size(pubKey);
	sBufLen = dBufLen - 11;
	fpSrc = fopen(srcFilename, "rb");
	fpTgt = fopen(enFilename, "wb");
	sBuf = (char *)malloc(sBufLen);
	dBuf = (char *)malloc(dBufLen);
	while(1)
	{
		int len;

		readLen = fread(sBuf, 1, sBufLen, fpSrc);
		if(readLen > 0)
		{
			len = RSA_public_encrypt(readLen, (unsigned char *)sBuf, (unsigned char *)dBuf, pubKey, RSA_PKCS1_PADDING);
			if (len < 0)
			{
				printf("RSA_public_encrypt failed!%u\n", ERR_get_error());
				break;
			}
			fwrite(dBuf, 1, len, fpTgt);
		}
		else if(feof(fpSrc) && !ferror(fpSrc))
		{
			break;
		}
		else
		{
			printf("inner_encryptFile fread failed!");
			break;
		}
	}
	free(sBuf);
	free(dBuf);
	fflush(fpTgt);
	fclose(fpTgt);
	fclose(fpSrc);	
}

static void inner_decryptFile(const char *enFilename, RSA *priKey, const char *deFilename)
{
	FILE *fpEn;
	FILE *fpDe;
	size_t readLen;
	char *sBuf;
	char *dBuf;
	size_t sBufLen;
	size_t dBufLen;
	
	sBufLen = RSA_size(priKey);
	dBufLen = sBufLen - 11;
	fpEn = fopen(enFilename, "rb");
	fpDe = fopen(deFilename, "wb");
	sBuf = (char *)malloc(sBufLen);
	dBuf = (char *)malloc(dBufLen);
	while(1)
	{
		int len;
		
		readLen = fread(sBuf, 1, sBufLen, fpEn);
		if(readLen > 0)
		{
			len = RSA_private_decrypt(readLen, (unsigned char *)sBuf, (unsigned char *)dBuf, priKey, RSA_PKCS1_PADDING);
			if (len < 0)
			{
				printf("RSA_private_decrypt failed!%u\n", ERR_get_error());
				break;
			}
			fwrite(dBuf, 1, len, fpDe);
		}
		else if(feof(fpEn) && !ferror(fpEn))
		{
			break;
		}
		else
		{
			printf("inner_decryptFile fread failed!");
			break;
		}
	}
	free(sBuf);
	free(dBuf);
	fclose(fpEn);
	fflush(fpDe);
	fclose(fpDe);
}
 
int main(int argc, char *argv[])
{
	BIO *bio = NULL;
	RSA *publicRsa = NULL;
	RSA *privateRsa = NULL;
	if ((bio = BIO_new_mem_buf((void *)publicKey, -1)) == NULL)
	{
		printf("BIO_new_mem_buf publicKey error\n");
		return -1;
	} 	
   
	if ((publicRsa = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL)) == NULL) 
	{
		printf("PEM_read_bio_RSA_PUBKEY error\n");
		return -1;
	}
	BIO_free_all(bio);
	
	if ((bio = BIO_new_mem_buf((void *)privateKey, -1)) == NULL)
	{
		printf("BIO_new_mem_buf privateKey error\n");
		return -1;
	}
	if ((privateRsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL)) == NULL) 
	{
		printf("PEM_read_RSAPrivateKey error\n");
		return NULL;
	}
	BIO_free_all(bio);	
	
	inner_encryptFile(argv[1], publicRsa, argv[2]);
	inner_decryptFile(argv[2], privateRsa, argv[3]);
	
	RSA_free(publicRsa);
	RSA_free(privateRsa);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值