使用 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 库不会将换行符' 字符加密为单个换行符,而是加密为两个单独的符号。我编码错误,对换行符的想法错误,还是可能是其他任何东西?不要认为需要另一个代码片段,所以这是我粘贴的唯一一个,但如有必要,会提供另一个。
问题出在
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;
这应该有效。