举例如下:
#include <openssl/pem.h>
using namespace std;int openssl_base64_encode(const unsigned char* in, int inlen, char* out, int* outlen, bool newline)
{BIO* b64 = BIO_new(BIO_f_base64());BIO* bmem = BIO_new(BIO_s_mem());if (!b64 || !bmem) {fprintf(stderr, "fail to BIO_new\n");return -1;}b64 = BIO_push(b64, bmem);if (!newline)BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); // ignore newlines, write everything in one line*outlen = BIO_write(b64, in, inlen);if (*outlen <= 0 || *outlen != inlen) {fprintf(stderr, "fail to BIO_write\n");return -1;}BIO_flush(b64);BUF_MEM* buf = nullptr;BIO_get_mem_ptr(b64, &buf);*outlen = buf->length;memcpy(out, buf->data, *outlen);BIO_free_all(b64);return 0;
}int openssl_base64_decode(const char* in, int inlen, unsigned char* out, int* outlen, bool newline)
{BIO* b64 = BIO_new(BIO_f_base64());BIO* bmem = BIO_new_mem_buf(in, inlen);if (!b64 || !bmem) {fprintf(stderr, "fail to BIO_new\n");return -1;}b64 = BIO_push(b64, bmem);if (!newline)BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); // ignore newlines, write everything in one line*outlen = BIO_read(b64, out, inlen);if (*outlen <= 0) {fprintf(stderr, "fail to BIO_read\n");return -1;}BIO_free_all(b64);return 0;
}void base64_test()
{char jwtHeader[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9";printf("jwt header origin:%s\n", jwtHeader);unsigned char jwtDecode[256] = {0};int jwtDecodeLen = 0;openssl_base64_decode(jwtHeader, strlen(jwtHeader), jwtDecode, &jwtDecodeLen, false);jwtDecode[jwtDecodeLen] = '\0';printf("jwt header decode:%s\n", jwtDecode);char jwtEncode[256] = {0};int jwtEncodeLen = 0;openssl_base64_encode(jwtDecode, strlen((char*)jwtDecode), jwtEncode, &jwtEncodeLen, false);jwtEncode[jwtEncodeLen] = '\0';printf("jwt header encode:%s\n", jwtEncode);
}int main()
{base64_test(); return 0;
}
编译时需要加上链接库参数:-lssl -lcrypto
运行程序输出:
jwt header origin:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
jwt header decode:{"alg":"HS256","typ":"JWT"}
jwt header encode:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
注:base64编码后的字符串长度的计算方法为:向上取整(原始字节数 / 3) * 4
也就是:base64_len = ( strlen(str_in)/3 + 1) * 4;