c – openssl加密库 – base64转换

我正在使用openssl BIO对象将二进制字符串转换为base64字符串.代码如下:

void ToBase64(std::string & s_in) {
    BIO * b_s = BIO_new( BIO_s_mem() );
    BIO * b64_f = BIO_new( BIO_f_base64() );

    b_s = BIO_push( b64_f , b_s);

    std::cout << "IN::" << s_in.length();
    BIO_write(b_s, s_in.c_str(), s_in.length());


    char * pp;
    int sz = BIO_get_mem_data(b_s, &pp);

    std::cout << "OUT::"  << sz << endl;

    s_in.assign(pp,sz);
    //std::cout << sz << " " << std::string(pp,sz) << std::endl;

    BIO_free (b64_f); // TODO ret error potential
    BIO_free (b_s);   // 
  }

长度为64或72.但是输出总是65,这是不正确的,它应该远大于此.文档不是世界上最好的,AFAIK bio_s_mem对象应该动态增长.我究竟做错了什么 ?

我可能最好找到一个不提供流媒体支持的自包含C类,并支持base64转换.流媒体支持不适合我的应用程序.但是我只想坚持使用openSSL,因为我已经完全依赖于一些加密例程.无论如何,我会在分析后做出这样的决定.

最佳答案 你有两个问题:

>你需要在mem bio上调用BIO_get_mem_data() – 但是你已经丢失了对它的引用(你用BIO_push的返回值覆盖它,它等于b64_f).
>在将所有数据写入之后,您应该在base64 bio上调用BIO_flush().

点赞