使用 C 和 OpenSSL 进行 Base64 编码

本文关键字:Base64 编码 进行 OpenSSL 使用 | 更新日期: 2023-09-27 17:56:41

我正在尝试用 C 语言使用 base64 和 OpenSSL 对字符串进行编码,稍后用 C# 对其进行解码。我有以下编码代码:

char *base64(const char *input, int length) {
    BIO *bmem, *b64;
    BUF_MEM *bptr;
    b64 = BIO_new(BIO_f_base64());
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    BIO_write(b64, input, length);
    BIO_flush(b64);
    BIO_get_mem_ptr(b64, &bptr);
    char *buff = (char *)malloc(bptr->length);
    memcpy(buff, bptr->data, bptr->length-1);
    buff[bptr->length-1] = 0;
    BIO_free_all(b64);
    return buff;
}

问题是当我用 C# 解码它时,出现以下错误:

Invalid length for a Base-64 char array or string.
搜索后,我发现解码的字符串长度

无效,我开始使用编码的字符串,发现(在我看来)OpenSSL 库不会将换行符' 字符加密为单个换行符,而是加密为两个单独的符号。我编码错误,对换行符的想法错误,还是可能是其他任何东西?不要认为需要另一个代码片段,所以这是我粘贴的唯一一个,但如有必要,会提供另一个。

使用 C 和 OpenSSL 进行 Base64 编码

问题出在

char *buff = (char *)malloc(bptr->length);
memcpy(buff, bptr->data, bptr->length-1);
buff[bptr->length-1] = 0;

因为,它比 Base64 少一个字节。

它应该是

char *buff = (char *)malloc(bptr->length+1);
memcpy(buff, bptr->data, bptr->length);
buff[bptr->length] = 0;

这应该有效。