首页 > 其他分享 >【技术】base64编码和解码

【技术】base64编码和解码

时间:2024-09-12 13:20:39浏览次数:13  
标签:编码 bio 解码 base64 BIO length data decoded

最近工作中遇到base64编解码,所以深入了解了下。

c语言和java的处理逻辑是不一样的,Linux下c语言实现主要有两种:

1.通用的base64编码和解码,即不依赖其他库的实现,不过这种方法,工作中目前测试不太适用。

2.依赖openssl库实现编码和解码

代码如下:

#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h> // Add this header for BUF_MEM definition
#include <string.h>
#include <stdio.h>
#include <stdlib.h> // Include stdlib.h for malloc/free

int base64_encode(const unsigned char *input, int length, char **encoded_data) {
    BIO *bio, *b64;
    BUF_MEM *buffer_ptr;

    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new(BIO_s_mem());
    bio = BIO_push(b64, bio);
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    BIO_write(bio, input, length);
    BIO_flush(bio);
    BIO_get_mem_ptr(bio, &buffer_ptr);

    *encoded_data = (char *)malloc(buffer_ptr->length + 1);
    memcpy(*encoded_data, buffer_ptr->data, buffer_ptr->length);
    (*encoded_data)[buffer_ptr->length] = '\0';

    BIO_free_all(bio);
    return 0;
}

int base64_decode(const char *input, unsigned char **decoded_data, int *decoded_length) {
    BIO *bio, *b64;
    int decode_len = 0;

    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new_mem_buf((void*)input, -1); // Cast input to void* to match function signature
    bio = BIO_push(b64, bio);
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);

    *decoded_data = (unsigned char *)malloc(strlen(input));
    decode_len = BIO_read(bio, *decoded_data, strlen(input));

    BIO_free_all(bio);
    *decoded_length = decode_len;
    return (decode_len > 0);
}

int main() {
    const char *original_data = "Hello, OpenSSL!";
    char *encoded_data;
    unsigned char *decoded_data;
    int decoded_length;

    // Base64 Encode
    base64_encode((const unsigned char *)original_data, strlen(original_data), &encoded_data);
    printf("Base64 Encoded: %s\n", encoded_data);

    // Base64 Decode
    base64_decode(encoded_data, &decoded_data, &decoded_length);
    decoded_data[decoded_length] = '\0';
    printf("Base64 Decoded: %s\n", decoded_data);

    // Free allocated memory
    free(encoded_data);
    free(decoded_data);

    return 0;
}

openssl一般系统自带,直接用,编译命令如下:

g++ -o test test.cpp -lssl -lcrypto

执行结果如下:

./test
Base64 Encoded: SGVsbG8sIE9wZW5TU0wh
Base64 Decoded: Hello, OpenSSL!

如果直接用命令行执行

  1. 命令行工具使用示例

    • 编码

      echo -n "Hello, World!" | openssl enc -base64

      输出:SGVsbG8sIFdvcmxkIQ==

    • 解码

      cho -n "SGVsbG8sIFdvcmxkIQ==" | openssl enc -d -base64

      输出:Hello, World!

标签:编码,bio,解码,base64,BIO,length,data,decoded
From: https://blog.csdn.net/kevinlibo/article/details/142166671

相关文章

  • 器件:EC11编码器
    1序  编码器型号为"黄海电子有限公司"的"EC11A-227";参数特性和ALPS的EC11B区别不大,EC11A性能较好;  出于图片规整考虑,本文截取ALPS的EC11B的datasheet来分析EC11A,推荐电路截取自"黄海电子"的"EC11B";2编码原理  EC11编码器为增量式编码器;由encoderA和encoderB两个光电传......
  • <<编码>> 第 4 章 手电筒剖析(Anatomy of a Flashlight) 示例电路
    简单灯泡电路info::操作说明鼠标单击按钮开关切换开合状态另:黄色小点为电流,后同.可通过“菜单–选项–显示电流”控制是否显示primary::在线交互操作链接https://cc.xiaogd.net/?startCircuitLink=https://book.xiaogd.net/code-hlchs-examples/assets/circ......
  • 如何看待2020年的最新国际视频编解码标准H.266?
    技术背景与发布H.266,也被称为多功能视频编码(VersatileVideoCoding,简称VVC),是2020年定稿并发布的最新一代国际视频编码标准。发布时间与机构:H.266由ISO/IECMPEG和ITU-TVCEG联合制定,于2020年7月定稿。ITU第一版于当年11月正式发布,ISO/IEC第一版则于2021年2月正式发布。标准目标:H.2......
  • --优质Java基础练习-- 采取控制台方式书写简单学生管理系统【升级版本(含注册登录功能)
    目录前言     该项目涉及的知识点项目准备 JDK编程工具Idea 需求文档-升级部分(参考黑马程序员)学生管理系统升级版需求分析登录界面用户类注册功能登录功能忘记密码验证码规则需求分析 编码新建项目-StudentManagementStudent类User类 核心方......
  • 了解base64的一些隐写
    今天刷题发现base64原来还能隐写,隐写主要是靠base64后面补的等号。因为base64在加密的时候如果后面位数不足就会补=(00),而解码的时候如果后面有多余的就直接丢弃,这样也不会影响原文。那我们如果补00的时候补的不是00呢,那我们岂不是可以在这上面做文章,这样就能做到隐写了。解码的......
  • 优秀的安防视频监控平台应该具备怎样的视频编解码能力?
    随着安防技术的飞速发展,监控平台作为保障公共安全、维护社会秩序的重要工具,其性能与效率日益成为行业关注的焦点。其中,监控平台的视频编码能力在视频监控系统中扮演着至关重要的角色,视频编码技术作为监控系统的核心组成部分,直接影响着视频数据的传输效率、存储成本及画质表现。......
  • Java中的安全编码实践:如何防止SQL注入与XSS攻击
    Java中的安全编码实践:如何防止SQL注入与XSS攻击大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,安全编码是确保应用程序免受攻击的关键因素。SQL注入和跨站脚本攻击(XSS)是最常见的安全漏洞之一。本文将介绍如何在Java中防止这两种攻击,并提......
  • 统一异常处理+错误编码设计方案
     一、背景1、系统在运行的时候可能会有下面这些种类的错误/失败发生:(1)依赖组件挂了,可能是db,可能是mq,可能是cache。(2)依赖服务挂了,可能是别人给你提供的http/rpc服务挂了。(3)可能是你的依赖方超时了。(4)可能是调用方的参数有问题。(5)可能是调用方的参数无法正确地通过校验......
  • 394. 字符串解码
    题目链接394.字符串解码思路字符串模拟;出现相同子问题,可以使用递归或者栈解决题解链接字符串解码(辅助栈法/递归法,清晰图解)关键点栈:需要存储(重复次数,当前字符串);递归:需要范围内嵌字符串及结束位置时间复杂度\(O(n)\)空间复杂度\(O(n)\)代码实现(栈......
  • MarsCode 用AI助力编码活动参与教程
    MarsCode用AI助力编码活动参与教程1.注册通过专有链接进入官网,并完成注册:https://www.marscode.cn/login?utm_source=community&utm_medium=jxh&utm_campaign=v0.1一定要在当前链接内完成注册也可通过手机扫码完成注册2.下载访问官网首页(marscode.cn),点击“立即获取编......