【OpenSSL】base64 with BIO filter

本文介绍如何使用 OpenSSL 的 BIO 过滤器进行 Base64 编码和解码,并提供了 C++ 示例代码。介绍了 BIO 对象的创建、使用及释放等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Introduction

  • There are many ways to do base64 encoding/decoding in OpenSSL, Here are some demos code with BIO filter. Other ways, e.g. EVP_* will be introduced later Base64 with EVP.

Encode

std::string CX509Cert::b64enc(const std::string & str)
{
    BIO* out = BIO_new(BIO_s_mem());// sink to memory.
    if (!out){
        return "";
    }

    BIO * b64 = BIO_new(BIO_f_base64());
    if (!b64){
        BIO_free(out);
        return "";
    }

    out = BIO_push(b64, out);

    BIO_write(out, (char *)str.c_str(), str.length());

    BIO_flush(out);

    BUF_MEM * bufptr = NULL;
    BIO_get_mem_ptr(out, &bufptr);
    std::string b64str = "";
    b64str.append((char *)bufptr->data, bufptr->length);

    BIO_free(b64);

    return b64str;
}

Decode

std::string CX509Cert::b64dec(const std::string & b64str)
{  
    BIO * in = BIO_new_mem_buf((void*)b64str.c_str(), b64str.length());
    if (!in) return "";

    BIO * b64 = BIO_new(BIO_f_base64());
    if (!b64){
        BIO_free(in);
        return "";
    }

    in = BIO_push(b64, in);

    char buf [16] = "";
    int bufsz = sizeof(buf);

    std::string str = "";
    for(;;){
        int cb = BIO_read(in, buf, bufsz);
        if (cb <= 0){
            break;
        }
        str.append(buf, cb);        
    }

    BIO_free(b64);

    return str;
}

Note

  • BIO_free(b64) will also free in/out BIOs, so, remeber do NOT double free them.
<think>好的,我需要帮助用户了解如何使用OpenSSLbase64进行私钥签名。首先,用户的需求涉及两个工具:OpenSSL用于签名,base64用于编码。我应该先分解步骤,确保每个部分都清楚。 首先,用户需要生成私钥。根据引用[3],生成RSA私钥可以使用`genrsa`命令。例如,生成一个2048位的私钥,保存为private_key.pem。然后可能需要将其转换为PKCS8格式,以确保兼容性,特别是如果用户使用Java或其他需要PKCS8格式的系统。这部分需要注意命令的正确性,比如`pkcs8 -topk8`的参数。 接下来是签名过程。引用[1]提到使用`openssl_sign`函数,但用户可能是在命令行操作,所以应该使用`openssl dgst`命令。这里需要确定签名算法,比如SHA256,对应引用[4]中的-SHA256选项。命令应该是`openssl dgst -sha256 -sign private_key.pem -out signature.bin data.txt`。这会生成二进制签名文件。 然后,用户需要用base64编码签名。这可以通过`base64 signature.bin > signature.base64`完成,或者在命令行中使用OpenSSLbase64功能,比如添加`-binary`选项避免换行问题。同时,用户可能需要解码base64字符串,以备验证时使用,所以也要提供解码命令。 验证签名部分,用户可能需要使用公钥来验证。因此,需要说明如何从私钥生成公钥,使用`openssl rsa -in private_key.pem -pubout -out public_key.pem`。然后,验证命令是`openssl dgst -sha256 -verify public_key.pem -signature signature.bin data.txt`。 需要注意的地方包括:私钥的格式是否正确,签名算法的选择(如SHA256),以及base64编码解码的正确使用。可能还需要提醒用户安全保存私钥,避免泄露。 最后,根据用户提供的引用,特别是引用[2]和[3],可能需要提到不同格式的私钥处理,比如PKCS8对于Java的重要性。此外,引用[4]中的生成CSR文件可能相关,但用户的问题集中在签名,所以可能不需要深入讨论CSR,除非用户有进一步的需求。 总结步骤:生成私钥、签名数据、base64编码、验证签名。确保每个步骤的命令准确无误,并且解释清晰。同时,生成相关问题,帮助用户深入理解,比如处理不同格式、性能优化和应用场景。</think>### 分步解答:使用OpenSSLbase64进行私钥签名 #### 1. 生成RSA私钥(PEM格式) ```bash openssl genrsa -out private_key.pem 2048 ``` 生成的私钥文件$private\_key.pem$需妥善保管[^3]。 #### 2. 签名数据并输出二进制签名文件 使用SHA256算法对$data.txt$签名: ```bash openssl dgst -sha256 -sign private_key.pem -out signature.bin data.txt ``` 此命令生成二进制签名文件$signature.bin$[^1][^4]。 #### 3. 对签名进行base64编码 将二进制签名转为base64字符串(避免换行符): ```bash openssl base64 -in signature.bin -out signature.base64 -A ``` 或使用系统工具: ```bash base64 -w 0 signature.bin > signature.base64 ``` #### 4. 验证签名(可选步骤) (需先生成公钥): ```bash openssl rsa -in private_key.pem -pubout -out public_key.pem ``` 解码base64并验证: ```bash openssl base64 -d -in signature.base64 -out decoded_signature.bin openssl dgst -sha256 -verify public_key.pem -signature decoded_signature.bin data.txt ``` ### 完整流程示例 ```bash # 生成数据文件 echo "Hello, OpenSSL!" > data.txt # 签名 openssl dgst -sha256 -sign private_key.pem -out signature.bin data.txt # Base64编码 base64 -w 0 signature.bin > signature.base64 # 解码验证 base64 -d signature.base64 > decoded_signature.bin openssl dgst -sha256 -verify public_key.pem -signature decoded_signature.bin data.txt ``` ### 关键注意事项 1. **私钥安全**:私钥文件$private\_key.pem$必须严格保密 2. **算法选择**:根据需求替换$sha256$为其他算法(如$sha512$) 3. **格式兼容性**:Java等系统可能需要PKCS#8格式私钥: ```bash openssl pkcs8 -topk8 -in private_key.pem -out private_key_pkcs8.pem -nocrypt ```[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值