关于在LinuxC下实现使用openssl库进行des-cbc加解密后base64编码解码的记录

关于在LinuxC下实现使用openssl库进行des-cbc加解密后base64编码解码的记录

解码编码过程

在过程中主要是以xml文档为加密因子,使用HTTP Request的方式把加密后的xml文档发送到服务器上然后把服务器返回的加密报文进行解密解码。
所需要的库就是#include <openssl/evp.h>

des-cbc解密加密代码

// des-cbc加密
int kk_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
               unsigned char *iv, unsigned char *ciphertext)
{
    EVP_CIPHER_CTX *ctx;

    int len;

    int ciphertext_len;
    ctx = EVP_CIPHER_CTX_new();
    EVP_EncryptInit_ex(ctx, EVP_des_cbc(), NULL, key, iv);
    printf("key:%s,iv:%s\r\n",key,iv);

    EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len);
    ciphertext_len = len;
    EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
    ciphertext_len += len;
    EVP_CIPHER_CTX_free(ctx);

    return ciphertext_len;
}

// des-cbc解密
int kk_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
               unsigned char *iv, unsigned char *ciphertext)
{
    EVP_CIPHER_CTX *ctx;

    int len;

    int ciphertext_len;
    ctx = EVP_CIPHER_CTX_new();
    EVP_EncryptInit_ex(ctx, EVP_des_cbc(), NULL, key, iv);
    printf("key:%s,iv:%s\r\n",key,iv);

    EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len);
    ciphertext_len = len;
    EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
    ciphertext_len += len;
    EVP_CIPHER_CTX_free(ctx);

    return ciphertext_len;
}

base64解码组码代码

// base64编码
char * base64Encode(const char *buffer, int length, bool newLine)
{
    BIO *bmem = NULL;
    BIO *b64 = NULL;
    BUF_MEM *bptr;
    b64 = BIO_new(BIO_f_base64());
    if (!newLine) {
        BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    }
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);
    BIO_write(b64, buffer, length);
    BIO_flush(b64);
    BIO_get_mem_ptr(b64, &bptr);
    BIO_set_close(b64, BIO_NOCLOSE);
    char *buff = (char *)malloc(bptr->length + 1);
    memcpy(buff, bptr->data, bptr->length);
    buff[bptr->length] = 0;
    BIO_free_all(b64);
    return buff;
}
//base64解码
char * base64Decode(char *input, int length, bool newLine)
{
        BIO *b64 = NULL;
        BIO *bmem = NULL;
        char *buffer = (char *)malloc(length);
        memset(buffer, 0, length);
        b64 = BIO_new(BIO_f_base64());
        if (!newLine) {
                BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
        }
        bmem = BIO_new_mem_buf(input, length);
        bmem = BIO_push(b64, bmem);
        BIO_read(bmem, buffer, length);
        BIO_free_all(bmem);
        return buffer;
}

main函数

这里就仅仅是加密编码的代码,需要解密解码的话调用剩余两个函数即可`.

//======================================================================
void des_decode(char* text, int ciphertext_len,char* dest)
{
         bool newLine = false;
        unsigned char key[32] = {0};
        unsigned char iv[32] = {0};
        unsigned char decryptedtext[1024*10];
        int decryptedtext_len ;
        snprintf((char*)key,32,"53MP236N");
        snprintf((char*)iv,32,"53MP236N");


        char * decode = base64Decode(text,ciphertext_len, newLine);
        decryptedtext_len = kk_decrypt((unsigned char*)decode,ciphertext_len , key, iv,decryptedtext);

        snprintf(dest,ciphertext_len,"%s",decryptedtext);


//      return decryptedtext ;



}

char* des_encode( unsigned char* text, int len)
{
         bool newLine = false;
        int ciphertext_len ;
        unsigned char key[32] = {0};
        unsigned char iv[32] = {0};
        unsigned char ciphertext[1024*10];

        snprintf((char*)key,32,"53MP236N");
        snprintf((char*)iv,32,"53MP236N");

        ciphertext_len = kk_encrypt (text, strlen((char *)text), key, iv,ciphertext);

        char*  encode = base64Encode((char*)ciphertext,ciphertext_len, newLine);
        return encode ;



}

int main(int argc, char **argv)
{
        int oc;
        char* cfgFileName = NULL;
        char* serviceName = NULL;
        char* infile = NULL;
        char* defaultStYYYYMM = NULL;
        char* defaultEndYYYYMM = NULL;
        char* logFileNamePrefix = NULL;
        char result[2048] = {0};
        FILE* fp = NULL;
        fp = fopen(argv[1], "r");
        char xml[1024*10] = {0};
        int len = fread(xml, 1, sizeof(xml), fp);
//      xml[len-1] = '\0';
        fclose(fp);

        while((oc = getopt(argc, argv, "c:s:f:l:")) != -1) {
                switch(oc) {
                        case 'c':
                                cfgFileName = optarg;
                                break;
                        case 'f':
                                infile = optarg;
                                break;
                }
        }
        unsigned char text[1024*10] = {0};
        snprintf((char*)text,sizeof(text),"%s",xml);
        printf("text is %s\n\r",text);
//      text[strlen(text) - 1] = '\0';
        char*encode = des_encode(text,strlen((char*)text));
        printf("encode:[[%s]]\n",encode);

}

编译成功后输入命令
./code base64.xml

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值