• 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;

    }

  • 相关阅读:
    [USACO14DEC] Cow Jog_Gold 牛慢跑(金)题解
    [USACO16DEC]Moocast(gold)奶牛广播-金 题解
    [USACO17FEB]Why Did the Cow Cross the Road III S题解
    [USACO4.3]逢低吸纳Buy Low, Buy Lower题解
    洛谷P5057 [CQOI2006]简单题题解
    ksum及二维版本
    [Noip2015] 信息传递
    数据库常用操作
    解决Mac连接MySQL需要输入绝对路径的问题
    在MAC上安装OpenCV(C++)
  • 原文地址:https://www.cnblogs.com/ruigelwang/p/12750423.html
Copyright © 2020-2023  润新知