Open SSL 3.0相關知識以及源碼流程分析

Open SSL 3.0相關知識以及源碼流程分析

編譯

  • windows環境編譯

1、工具安裝

安裝安裝perl腳本解釋器、安裝nasm匯編器(添加到環境變量)、Visual Studio編譯工具

安裝dmake

 ppm install dmake # 需要過墻

2、開始編譯

# 1、找到Visual Studio命令行編譯工具目錄 或者菜單欄直接啟動對應架構的cmd程序
# D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build
# 找到合適的編譯架構bat 雙擊 比如:vcvars32.bat# 2、進入openssl目錄
cd D:\openssl-openssl-3.1.0# 3、perl生成對應的makefile
# -prefix 是編譯后輸出的路徑,默認會生成到C:\Program Files (x86)目錄
perl Configure VC-WIN32 --prefix=D:\openssl-openssl-3.1.0\mybuild# 4、編譯等待
nmake# 5、安裝到指定目錄
# 編譯好的文件安裝到指定目錄,默認是C:\Program Files (x86)\OpenSSL,如果是在C盤,運行控制臺是需要有管理員權限
nmake install
  • Linux編譯
# 1、解壓進入目錄
# 2、config配置
./config
# 3、編譯
make
# 4、安裝庫到指定目錄 /usr/local/include/openssl /usr/local/lib
make install
  • 基礎使用

Open SSL 3.0支持國密sm2 sm3 sm4

包含對稱加密、非對稱加密、單向散列、偽隨機、簽名、密碼交換、證書等一系列算法庫。

applink錯誤處理

解決辦法:

// 屬性配置  -> C++ -> 預處理器   _CRT_SECURE_NO_WARNINGS
extern "C"
{#include <openssl/applink.c>
};

編碼原理

  • Base16

用16進制來編碼

static const char BASE16_ENC_TAB[] = "0123456789ABCDEF";
static const char BASE16_DEC_TAB[128] = {-1,											// 0-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	    // 1-10-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	    // 11-20-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	    // 21-30-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	    // 31-40-1, -1, -1, -1, -1, -1, -1,  0,  1,  2,	    // 41-503,  4,  5,  6,  7,  8,  9, -1, -1, -1,	    // 51-60-1, -1, -1, -1, 10, 11, 12, 13, 14, 15,	    // 61-70
};int base16Encode(const unsigned char* in, int size, char* out)
{for (int i = 0; i < size; i++){// 一個字節取出高4位和低4位char h = in[i] >> 4; // 移位丟棄低位char low = in[i] & 0x0F; // & 去掉高位out[i * 2] = BASE16_ENC_TAB[h]; // 0~15映射到對應字符串out[i * 2 + 1] = BASE16_ENC_TAB[low];}// base16轉碼后空間擴大一倍  4位轉成一個字符  1個字符轉成2個字符return size * 2;
}int base16Decode(const string& in, unsigned char* out)
{// 將兩個字符拼接成一個字符for (int i = 0; i < in.size(); i += 2){unsigned char ch = in[i];  // 高位轉換的字符unsigned char cl = in[i + 1]; // 低位轉換的字符unsigned char h = BASE16_DEC_TAB[ch];  // 轉換成原來的值unsigned char l = BASE16_DEC_TAB[cl];// 兩個4位拼成一個字符out[i / 2] = h << 4 | l;}return in.size() / 2;
}int main(int argc, char* argv[])
{const unsigned char data[] = "測試Base16";int len = sizeof(data);char out1[1024] = { 0 };unsigned char out2[1024] = { 0 };cout << data << endl;int encode_result = base16Encode(data, len, out1);cout << "encode_result = " << encode_result << " out1:" << out1 << endl;int decode_result = base16Decode(out1, out2);cout << "decode_result = " << decode_result << " out2:" << out2 << endl;getchar();return 0;
}
  • Base64

二進制轉字符串

原理:

把3個8位字節(3x8=24)轉化為4個6位的字節(4x6=24),之后在6位的前面補兩個0,形成8位一個字節的形式。如果剩下的字符不足3個字節,則用0填充,輸出字符使用“=”,因此編碼后輸出的文本末尾可能會出現1或者2個“=”。

  • Open SSL bio接口

使用bio接口實現base64編碼

#include "Base64.h"
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <iostream>int Base64::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 filter// BIO_new創建bio對象// BIO_f_base64封裝了base64編碼方法的BIO,寫的時候編碼,讀的時候解碼// BIO_s_mem 封裝了內存操作的bio接口,包括對內存的讀寫操作auto b64_bio = BIO_new(BIO_f_base64());if (!b64_bio){BIO_free(mem_bio);return 0;}// 形成bio鏈,連接兩個對象到鏈表中b64_bio->mem_bio// b64-memBIO_push(b64_bio, mem_bio);// 設置超過64字節不添加換行符, 解碼需要對應的設置BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL);// 寫入到base64 filter進行編碼,結果會傳遞到鏈表的下一個節點// 到mem中讀取結果(鏈表頭部代表了整個鏈表)// BIO_write 編碼 3字節-> 4字節 不足3字節補充0和=// 編碼數據每64字節會加\n 換行符, 默認結尾有換行符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 Base64::base64Decode(const char* in, int len, unsigned char* out_data)
{if (!in || len <= 0 || !out_data){return 0;}// 內存源 密文// 創建一個內存型的bio對象auto mem_bio = BIO_new_mem_buf(in, len);if (!mem_bio){return 0;}// base64 filterauto 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 從bio接口讀出len字節到buf中int re = BIO_read_ex(b64_bio, out_data, len, &size);BIO_free_all(b64_bio);return size;
}// main.cpp
int main(int argc, char* argv[])
{Base64 *base = new Base64();const unsigned char data[] = "測試Base64阿斯頓發到付親戚212阿發的順豐到付412341324321432141243按時發放";int len = sizeof(data);char out[1024] = { 0 };int res = base->base64Encode(data, len, out);if (res > 0){cout << "[" << out <&

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908220.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Redis】筆記|第5節|Redisson實現高并發分布式鎖核心源碼

一、加鎖流程 1. 核心方法調用鏈 RLock lock redisson.getLock("resource"); lock.lock(); // 阻塞式加鎖? lockInterruptibly()? tryAcquire(-1, leaseTime, unit) // leaseTime-1表示啟用看門狗? tryAcquireAsync()? tryLockInnerAsync() // 執行Lua腳本 2…

基于React + TypeScript構建高度可定制的QR碼生成器

前言 在現代Web應用中&#xff0c;QR碼已成為連接線上線下的重要橋梁。本文將詳細介紹如何使用React TypeScript Vite構建一個功能強大、高度可定制的QR碼生成器&#xff0c;支持背景圖片、文本疊加、HTML模塊、圓角導出等高級功能。 前往試試 項目概述 技術棧 前端框架:…

【MATLAB代碼】制導——三點法,二維平面下的例程|運動目標制導,附完整源代碼

三點法制導是一種導彈制導策略,主要用于確保導彈能夠準確追蹤并擊中移動目標。該方法通過計算導彈、目標和制導站之間的相對位置關系,實現對目標的有效制導。 本文給出MATLAB下的三點法例程,模擬平面上捕獲運動目標的情況訂閱專欄后可直接查看源代碼,粘貼到MATLAB空腳本中即…

Ubuntu22.04 安裝 IsaacSim 4.2.0

1. 從官網下載 IsaacSim 4.2.0 安裝包 https://download.isaacsim.omniverse.nvidia.com/isaac-sim-standalone%404.2.0-rc.18%2Brelease.16044.3b2ed111.gl.linux-x86_64.release.zip 2. 查閱 Workstation Installation 安裝方式 Workstation Installation — Isaac Sim Do…

開源量子模擬引擎:Quantum ESPRESSO本地部署教程,第一性原理計算輕松入門!

一、介紹 Quantum ESPRESSO 是一個用于電子結構計算和納米尺度材料建模的開源計算機代碼集成套件&#xff0c;專門用于進行第一性原理&#xff08;第一性原理&#xff09;計算&#xff0c;涵蓋了電子結構、晶體學和材料性能的模擬。 Quantum ESPRESSO GPU 版本支持GPU加速&am…

PVE 虛擬機安裝 Ubuntu Server V24 系統 —— 一步一步安裝配置基于 Ubuntu Server 的 NodeJS 服務器詳細實錄1

前言 最近在基于 NodeJS V22 寫一個全棧的項目&#xff0c;寫好了&#xff0c;當然需要配置服務器部署啦。這個過程對于熟手來說&#xff0c;還是不復雜的&#xff0c;但是對于很多新手來說&#xff0c;可能稍微有點困難。所以&#xff0c;我把整個過程全部記錄一下。 熟悉我…

【JUC】深入解析 JUC 并發編程:單例模式、懶漢模式、餓漢模式、及懶漢模式線程安全問題解析和使用 volatile 解決內存可見性問題與指令重排序問題

單例模式 單例模式確保某個類在程序中只有一個實例&#xff0c;避免多次創建實例&#xff08;禁止多次使用new&#xff09;。 要實現這一點&#xff0c;關鍵在于將類的所有構造方法聲明為private。 這樣&#xff0c;在類外部無法直接訪問構造方法&#xff0c;new操作會在編譯…

2. 庫的操作

2.1 創建數據庫 語法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name # 字符集: 存儲編碼 [DEFAULT] COLLATE collation_name # 校驗集: 比較/選擇/讀…

道可云人工智能每日資訊|北京農業人工智能與機器人研究院揭牌

道可云人工智能&元宇宙每日簡報&#xff08;2025年6月3日&#xff09;訊&#xff0c;今日人工智能&元宇宙新鮮事有&#xff1a; 北京農業人工智能與機器人研究院揭牌 5月30日&#xff0c;北京市農業農村局、北京市海淀區人民政府、北京市農林科學院共同主辦北京農業人…

【JSON-to-Video】設置背景視頻片斷

目錄 設置bgVideo字段 1. 設置bgVideo.videoList字段 2. 設置randomPlay字段 3. 設置complete字段 4. 調用API&#xff0c;制作視頻 歡迎來到JSON轉視頻系列教程。今天要教大家如何添加背景視頻片斷&#xff0c;在視頻制作中&#xff0c;巧妙運用背景視頻&#xff0c;能為…

星閃開發之Server-Client 指令交互控制紅燈亮滅案例解析(SLE_LED詳解)

系列文章目錄 星閃開發之Server-Client 指令交互控制紅燈亮滅的全流程解析&#xff08;SLE_LED詳解&#xff09; 文章目錄 系列文章目錄前言一、項目地址二、客戶端1.SLE_LED_Client\inc\SLE_LED_Client.h2.SLE_LED_Client\src\SLE_LED_Client.c頭文件與依賴管理宏定義與全局變…

Linux shell練習題

Shell 1. 判斷~/bigdata.txt 是否存在&#xff0c;若已存在則打印出”該文件已存在“&#xff0c;如不存在&#xff0c;則輸出打印&#xff1a;”該文件不存在“ if [ -f ./bigdata.txt ];then echo "文件存在" else echo "文件不存在" fi2. 判斷~/bigd…

Linux基本指令(三)

接上之前的文章&#xff0c;咱繼續分享Linux的基本指令&#xff0c;Linux指令比較多&#xff0c;很難全部記住需要做筆記對常用的指令進行記錄&#xff0c;方便以后復習查找&#xff0c;做筆記也可以對知識理解更加深刻。 目錄 時間相關指令 date顯示 時間戳 cal指令 ?編…

WebRTC中sdp多媒體會話協議報文詳細解讀

sdp介紹 在WebRTC&#xff08;Web實時通信&#xff09;中&#xff0c;SDP&#xff08;Session Description Protocol&#xff09;是用來描述和協商多媒體會話的協議。它定義了會話的參數和媒體流的信息&#xff0c;如音視頻編碼格式、傳輸方式、網絡地址等。SDP是WebRTC中一個…

【MySQL】 約束

一、約束的定義 MySQL 約束是用于限制表中數據的規則&#xff0c;確保數據的 準確性 和 一致性 。約束可以在創建表時定義&#xff0c;也可以在表創建后通過修改表結構添加。 二、常見的約束類型 2.1 NOT NULL 非空約束 加了非空約束的列不能為 NULL 值&#xff0c;如果可以…

【.net core】【watercloud】樹形組件combotree導入及調用

源碼下載:combotree: 基于layui及zTree的樹下拉框組件 鏈接中提供了組件的基本使用方法 框架修改內容 1.文件導入&#xff08;路徑可更具自身情況自行設定&#xff09; 解壓后將文件夾放在圖示路徑下&#xff0c;修改文件夾名稱為combotree 2.設置路徑&#xff08;設置layu…

ES101系列07 | 分布式系統和分頁

本篇文章主要講解 ElasticSearch 中分布式系統的概念&#xff0c;包括節點、分片和并發控制等&#xff0c;同時還會提到分頁遍歷和深度遍歷問題的解決方案。 節點 節點是一個 ElasticSearch 示例 其本質就是一個 Java 進程一個機器上可以運行多個示例但生產環境推薦只運行一個…

CppCon 2015 學習:3D Face Tracking and Reconstruction using Modern C++

1. 3D面部追蹤和重建是什么&#xff1f; 3D面部追蹤&#xff08;3D Face Tracking&#xff09;&#xff1a; 實時檢測并追蹤人臉在三維空間中的位置和姿態&#xff08;如轉頭、點頭、表情變化等&#xff09;&#xff0c;通常基于攝像頭捕獲的視頻幀。3D面部重建&#xff08;3D…

代碼中的問題及解決方法

目錄 YOLOX1. AttributeError: VOCDetection object has no attribute cache2. ValueError: operands could not be broadcast together with shapes (8,5) (0,)3. windows遠程查看服務器的tensorboard4. AttributeError: int object has no attribute numel YOLOX 1. Attribu…

【JVM】Java類加載機制

【JVM】Java類加載機制 什么是類加載&#xff1f; 在 Java 的世界里&#xff0c;每一個類或接口在經過編譯后&#xff0c;都會生成對應的 .class 字節碼文件。 所謂類加載機制&#xff0c;就是 JVM 將這些 .class 文件中的二進制數據加載到內存中&#xff0c;并對其進行校驗…