zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    REUSE_ALV_GRID_DISPLAY_LVC I_CALLBACK_HTML_TOP_OF_PAGE
    查找数组中最大值java
    jvm 调优
    jvm 内存
    树形遍历文件夹
    程序创建一个ArrayList,添加1到10的10个随机数,删除大于5的数 java
    字符串反序排序 并带有空格输出 java
    摆动排序
    免密登陆
    springboot UEditor集成
  • 原文地址:https://www.cnblogs.com/ruigelwang/p/12750423.html
Copyright © 2011-2022 走看看