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\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)
{
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);
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);
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;

}

猜你喜欢

转载自www.cnblogs.com/ruigelwang/p/12750423.html