C++:通过openssl完成base64编解码-创新互联

举例如下:

10年积累的网站建设、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有晋源免费网站建设让你可以放心的选择与我们合作。
#includeusing 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;

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧

名称栏目:C++:通过openssl完成base64编解码-创新互联
当前路径:https://www.cdcxhl.com/article30/esdpo.html

成都网站建设公司_创新互联,为您提供定制网站App开发域名注册关键词优化企业网站制作软件开发

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发