使用libssl进行Bad Base64编码

时间:2010-09-14 18:01:16

标签: c openssl base64

假设以下代码,我的base64编码中出现了奇怪的错误。

#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <stdio.h>
#include <string.h>

char * base64(unsigned char * input, int length) {

    BIO *b64 = NULL;
    BIO * bmem = NULL;
    BUF_MEM *bptr = NULL;
    char * output = NULL;

    b64 = BIO_new((BIO_METHOD *)BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);
    BIO_write(b64, input, length);
    BIO_flush(b64);
    BIO_get_mem_ptr(b64, &bptr);

    output = (char *) calloc (bptr->length, sizeof(char));
    memcpy(output, bptr->data, bptr->length);

    BIO_free_all(b64);

    return output;
}


int main(int argc, char *argv[]) {


    char * based_string = NULL;

    based_string = base64(argv[1], strlen(argv[1]));
    printf("%s\n", based_string);
    free(based_string);
    return 0;
}

我用gcc test.c -o test -lcrypto

编译它

如果我跑:

./test testtes

我的结果是dGVzdHRlcw==�而不是dGVzdHRlcw==

如果我跑:

./test test

我有dGVzdA==作为回报,这是好结果。

以前的源代码有什么问题。

1 个答案:

答案 0 :(得分:7)

output = (char *) calloc (bptr->length + 1, sizeof(char));

你错过了'+1',因此缓冲区中没有空余终结符的空间。