컴파일 : gcc a.c -lcrypto -o a.out
a.c
#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <stdint.h>
#include <assert.h>
int main(int argc, char *argv[])
{
    char sPlainText[1024];
    char *base64_enc = NULL;
    char sBase64Text[1024];
    char *base64_dec = NULL;
size_t nBase64DecLen;
if (strcmp(argv[1], "e") == 0) {
sprintf(sPlainText, "%s", argv[2]);
fprintf(stdout, "encrypt original text: %s\n", sPlainText);
Base64Encode(sPlainText, strlen(sPlainText), &base64_enc);
fprintf(stdout, "encoded:%s\n", base64_enc);
    }
    else if(strcmp(argv[1], "d") == 0) {
sprintf(sBase64Text, "%s", argv[2]);
fprintf(stdout, "decrypt original text: %s\n", sBase64Text);
Base64Decode(sBase64Text, &base64_dec, &nBase64DecLen);
fprintf(stdout, "decoded:%s\n", base64_dec);
    }
    else {
fprintf(stdout, "invalid argument\n");
return -1;
}
return 0;
}
int Base64Encode(const unsigned char* buffer, size_t length, char** b64text)
{
    BIO *bio, *b64;
    BUF_MEM *bufferPtr;
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new(BIO_s_mem());
    bio = BIO_push(b64, bio);
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    BIO_write(bio, buffer, length);
    BIO_flush(bio);
    BIO_get_mem_ptr(bio, &bufferPtr);
    BIO_set_close(bio, BIO_NOCLOSE);
    BIO_free_all(bio);
*b64text=(*bufferPtr).data;
    return 0;
}
size_t CalculateBase64DecodeLength(const char* b64input)
{
    size_t len = 0;
    size_t padding = 0;
len = strlen(b64input);
    if (b64input[len-1] == '=' && b64input[len-2] == '=') {
        padding = 2;
    }
    else if (b64input[len-1] == '=') {
        padding = 1;
    }
    return (len*3)/4 - padding;
}
int Base64Decode(char* b64message, unsigned char** buffer, size_t* length)
{
    BIO *bio, *b64;
    
    int decodeLen = 0;
decodeLen = CalculateBase64DecodeLength(b64message);
*buffer = (unsigned char*)malloc(decodeLen + 1);
(*buffer)[decodeLen] = '\0';
    bio = BIO_new_mem_buf(b64message, -1);
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_push(b64, bio);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
*length = BIO_read(bio, *buffer, strlen(b64message));
    assert(*length == decodeLen);
    BIO_free_all(bio);
    return 0;
}


