1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include<iostream> #include<openssl/rand.h> #include<openssl/evp.h> #include<openssl/buffer.h> using namespace std; int Base64Decode(const char* in, int len, unsigned char* out_data) { if (!in || len <= 0 || !out_data) { return 0; } auto mem_bio = BIO_new_mem_buf(in, len); if (!mem_bio)return 0; auto b64_bio = BIO_new(BIO_f_base64()); if (!b64_bio) { BIO_free(mem_bio); return 0; } BIO_push(b64_bio, mem_bio); BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL); size_t size = 0; BIO_read_ex(b64_bio,out_data,len, & size);
BIO_free_all(b64_bio); return size; } int Base64Encode(const unsigned char* in, int len, char* out_base64) { if (!in || len <= 0 || !out_base64) { return 0; } auto mem_bio = BIO_new(BIO_s_mem()); if (!mem_bio)return 0; auto b64_bio = BIO_new(BIO_f_base64()); if (!b64_bio) { BIO_free(mem_bio); return 0; } BIO_push(b64_bio, mem_bio); BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL);
int re = BIO_write(b64_bio, in, len); if (re <= 0) { BIO_free_all(b64_bio); return 0; } BIO_flush(b64_bio); int outsize = 0; BUF_MEM* p_data = 0;
BIO_get_mem_ptr(b64_bio, &p_data); if (p_data) { memcpy(out_base64, p_data->data,p_data->length); outsize = p_data->length; } BIO_free_all(b64_bio); return outsize; } int main() { cout << "Test openssl BIO base64!" << endl; unsigned char data[] = "测试Base64数据1234325443154154324132432142e32143211ewe32erqwerewq rewq feewqfwe32r32414532r"; int len = sizeof(data); unsigned char out[1024] = { 0 }; int re = Base64Encode(data, len, (char*)out); if (re > 0) { out[re] = '\0'; cout << out << endl; } unsigned char out2[1024] = { 0 }; re = Base64Decode((char*)out, re, out2); cout << out2 << endl; getchar(); return 0; }
|