openssl -- 加解密函数调用示例 -- 代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#define OPENSSLKEY "../priv.key"
#define PUBLICKEY "../pub.key"
#define BUFFSIZE 1024

char * my_encrypt(char *str, char *path_key);
char * my_decrypt(char *str, char *path_key);

int main()
{
char *source = "i like dancing!!";
char *ptr_en, *ptr_de;
printf("Source is : %s ", source);
ptr_en = my_encrypt(source, PUBLICKEY);
printf("after encrypt: ");
int i = 0;
while(ptr_en[i])
{
if(i %8 == 0)
{
printf(" %08d: ",i);
}
printf("%02x ",(unsigned char)ptr_en[i++]);
}

ptr_de = my_decrypt(ptr_en, OPENSSLKEY);
printf(" after decrypt: %s ", 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)
{
char *p_en;
RSA *p_rsa;
FILE * file;
int rsa_len;
if((file = fopen(path_key,"r")) == NULL)
{
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 = (unsigned char *) malloc(rsa_len+1);
memset(p_en, 0, rsa_len+1);

/*
原型:
int RSA_public_encrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
返回加密数据的大小(i.e., RSA_size(rsa)).

说明:
RSA_public_encrypt()使用公钥rsa(通常是一个会话密钥)加密从from地址开始的flen个字节,
并将密文存储到地址to。且to必须指向内存的RSA_size(rsa)字节。
padding表示下列模式之一:
RSA_PKCS1_PADDING, RSA_PKCS1_OAEP_PADDING, RSA_SSLV23_PADDING, RSA_NO_PADDING

flen 不能大于RSA_size(rsa)-11 , 对于基于PKCS #1 v1.5的填充模式是11
不能大于RSA_size(rsa) - 42, 对于RSA_PKCS1_OAEP_PADDING是42
对于RSA_NO_PADDING是RSA_size(rsa)。
当使用的填充模式不是RSA_NO_PADDING时,RSA_public_encrypt()会在密文中包含一些随机字节,
因此每次密文都是不同的,即使明文和公钥完全相同。
在to中返回的密文总是被填充为零,精确到RSA_size(rsa)字节。往返可能重叠。
*/
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)
{
char * p_de;
RSA * p_rsa;
FILE * file;
int rsa_len;
if((file = fopen(path_key, "r")) == NULL)
{
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 = (unsigned char *)malloc(rsa_len+1);
memset(p_de, 0, rsa_len+1);

/*
原型:
int RSA_private_decrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
返回恢复的明文的大小。返回值0不是错误,只表示明文为空。

说明:
RSA_private_decrypt()使用私钥rsa对from所指的flen字节进行解密,并将明文存储到to。
flen应该等于RSA_size(rsa),但是当密文中的前项为零字节时,它可能会更小。
这些内容并不重要,可以删除,但是RSA_public_encrypt()不这样做。
to必须指向一个足够大的内存段,以容纳最大可能的解密数据(对于RSA_NO_PADDING等于RSA_size(rsa),
对于基于PKCS #1 v1.5的padding模式等于RSA_size(rsa) - 11,
对于RSA_PKCS1_OAEP_PADDING等于RSA_size(rsa) - 42)。
padding是用于加密数据的填充模式。往返可能重叠。
*/
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;

}

原文地址:https://www.cnblogs.com/ruigelwang/p/12750423.html