openssl passwd,C++安全方向(二):2.4 openssl_BIO接口解析

 2023-10-05 阅读 20 评论 0

摘要:數據源:我們通過BIO_new申請了內存的BIO對象,表示我們把數據寫入到BIO中。 過濾器:通過過濾器處理數據,提供了多種方法。比如一個數據進入之后,先做md5,做完md5之后,再交給Base64來生成最終數據,md5是哈希值,

在這里插入圖片描述

數據源:我們通過BIO_new申請了內存的BIO對象,表示我們把數據寫入到BIO中。
過濾器:通過過濾器處理數據,提供了多種方法。比如一個數據進入之后,先做md5,做完md5之后,再交給Base64來生成最終數據,md5是哈希值,生成二進制,通過Base64處理為字符,進行輸出。
BIO鏈:BIO_PUSH使得數據形成了一個鏈表。對這個鏈表數據進行讀寫操作。
如下代碼:

#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <iostream>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;//base64過濾器auto b64_bio = BIO_new(BIO_f_base64());if (!b64_bio){BIO_free(mem_bio);return 0;}//形成BIO鏈BIO_push(b64_bio, mem_bio);//默認讀取換行符做結束BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL);//讀取 解碼 4字節轉3字節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;//內存源 sourceauto mem_bio = BIO_new(BIO_s_mem());if (!mem_bio)return 0;//base64 filterauto b64_bio = BIO_new(BIO_f_base64());if (!b64_bio){BIO_free(mem_bio);return 0;}//形成BIO鏈表//b64-memBIO_push(b64_bio, mem_bio);//超過64字節不添加換行符(\n),編碼的數據在一行中BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL);//寫入到base64_filter進行編碼,結果會傳遞到鏈表的下一個結點//到mem中讀取結果(鏈表頭部代表了整個鏈表)//BIO_write 編碼 3字節=>4字節,不足3字節補充0和=//注意:編碼數據每64字節會加\n換行符,默認結尾處是有換行符的,超過64位的時候再添一個int re = BIO_write(b64_bio, in, len);if (re < 0){//清空整個鏈表結點BIO_free_all(b64_bio);return 0;}//刷新下緩沖,寫入鏈表的memBIO_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 << "first openssl BIO based!" << endl;unsigned char data[] = "測試64數據你好哈你好哈你好哈你好哈你好哈你好哈你好哈你好哈你好哈";int len = sizeof(data);char out[1024] = { 0 };unsigned char out2[1024] = { 0 };cout << "source:" << data << endl;int re = Base64Encode(data, len, out);if (re > 0){out[re] = '\0';cout <<"encode:["<< out << "]" << ";;;;" << endl;}re = Base64Decode(out, re, out2);cout <<"decode:" << out2 << endl;getchar();return 0;
}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/114381.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息