openssl+ SM2 + linux 簽名校驗開發實例(C++)

文章目錄

  • 一、SM2校驗理論基礎
  • 二、SM2簽名校驗開發實例(C++)

一、SM2校驗理論基礎

SM2的校驗過程是使用橢圓曲線上的公鑰驗證簽名的有效性。以下是SM2校驗的理論基礎相關知識點:

  1. SM2簽名算法: SM2的校驗基于橢圓曲線數字簽名算法(ECDSA)。在簽名算法中,簽名者使用私鑰對消息的哈希值進行簽名,而驗證者使用相應的公鑰、簽名值和消息的哈希值進行驗證。

  2. 公鑰驗證簽名: SM2簽名校驗的核心在于使用簽名者的公鑰對簽名值進行驗證。只有持有私鑰的一方才能夠生成有效的簽名,而任何人都可以使用相應的公鑰驗證簽名的有效性。

  3. 橢圓曲線運算: 校驗過程中涉及到橢圓曲線上的數學運算,包括點的加法、點的乘法等。這些運算是基于橢圓曲線離散對數問題的難解性來保障安全性。

  4. 消息摘要算法: SM2簽名使用消息摘要算法對原始消息進行哈希,通常采用SM3算法。在校驗過程中,驗證者也需要使用相同的哈希算法對接收到的消息進行哈希。

  5. 橢圓曲線的離散對數問題: ECC的安全性基于橢圓曲線上的離散對數問題的難解性。在校驗過程中,驗證者需要執行橢圓曲線運算,確保簽名值與消息的哈希值匹配。

  6. SM2校驗流程:

    • 選擇橢圓曲線參數。
    • 生成公鑰。
    • 獲取簽名值、消息的哈希值和公鑰。
    • 使用橢圓曲線運算驗證簽名的有效性。
  7. 隨機數生成: 隨機數的生成在簽名的校驗中通常不涉及,因為驗證者只需要使用公鑰進行橢圓曲線運算。

  8. 校驗結果: 如果校驗成功,說明簽名是由持有相應私鑰的一方生成的,消息在傳輸過程中沒有被篡改,校驗者可以信任消息的完整性和真實性。

理解這些基礎知識點有助于深入了解SM2校驗的工作原理和安全性。在實際應用中,確保正確管理公鑰,處理錯誤和異常情況,并根據具體需求進行適當的安全性考慮。

二、SM2簽名校驗開發實例(C++)

在Linux環境下使用C++和OpenSSL庫進行SM2簽名校驗的示例代碼如下。請注意,這里的公鑰和簽名數據是預先準備好的,你需要替換為你實際的公鑰、簽名和消息哈希值。

#include <openssl/evp.h>
#include <openssl/sm2.h>
#include <openssl/pem.h>int main() {EVP_PKEY* pubKey = EVP_PKEY_new();FILE* publicKeyFile = fopen("public_key.pem", "r");// 從文件中加載公鑰if (!PEM_read_PUBKEY(publicKeyFile, &pubKey, NULL, NULL)) {perror("Error loading public key");return 1;}fclose(publicKeyFile);// 待驗證的簽名const char* signatureHex = "3046022100...";const char* messageHex = "e1e2a1...";// 將十六進制的簽名和消息哈希值轉換為二進制數據unsigned char* signature;unsigned char* messageHash;size_t sigLen, hashLen;sigLen = strlen(signatureHex) / 2;hashLen = strlen(messageHex) / 2;signature = (unsigned char*)malloc(sigLen);messageHash = (unsigned char*)malloc(hashLen);if (!signature || !messageHash) {perror("Memory allocation error");return 1;}if (hex2bin(signatureHex, signature, sigLen) != 0 ||hex2bin(messageHex, messageHash, hashLen) != 0) {perror("Error converting hex to binary");free(signature);free(messageHash);return 1;}// 創建 SM2 驗簽上下文EVP_MD_CTX* ctx = EVP_MD_CTX_new();EVP_MD_CTX_init(ctx);// 選擇 SM3 摘要算法const EVP_MD* md = EVP_sm3();// 初始化驗簽if (!EVP_DigestVerifyInit(ctx, NULL, md, NULL, pubKey)) {perror("Error initializing verification");free(signature);free(messageHash);return 1;}// 添加待驗證的消息if (!EVP_DigestVerifyUpdate(ctx, messageHash, hashLen)) {perror("Error updating verification");free(signature);free(messageHash);return 1;}// 執行驗簽int result = EVP_DigestVerifyFinal(ctx, signature, sigLen);// 輸出驗簽結果if (result == 1) {printf("Signature verification successful\n");} else {printf("Signature verification failed\n");}// 釋放資源EVP_MD_CTX_free(ctx);EVP_PKEY_free(pubKey);free(signature);free(messageHash);return 0;
}

請確保替換public_key.pemsignatureHexmessageHex為你實際使用的公鑰文件、簽名和消息哈希值。這個示例中的hex2bin函數用于將十六進制字符串轉換為二進制數據,你可以根據需要實現或使用現有的實現。

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

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

相關文章

Vue批量全局處理undefined和null轉為““ 空字符串

我們在處理后臺返回的信息&#xff0c;有的時候返回的是undefined或者null&#xff0c;這種字符串容易引起用戶的誤解&#xff0c;所以需要我們把這些字符串處理一下。 如果每個頁面都單獨處理&#xff0c;那么頁面會很冗余&#xff0c;并且后期如果有修改容易遺漏&#xff0c…

SQL面試題挑戰:找出使用相同ip的用戶

問題&#xff1a;現在有一張用戶登陸日志表&#xff0c;該表包括user_id,ip,log_time三個字段&#xff0c;現在需要找出共同使用ip數量超過3個(含)的所有用戶對。比如下面的示例數據&#xff0c;101和102用戶共同使用的ip為4個&#xff0c;101和103用戶共同使用的ip為3個&#…

二十二、數組(4)

本章概要 隨機生成泛型和基本數組 隨機生成 我們可以按照 Count.java 的結構創建一個生成隨機值的工具&#xff1a; Rand.java import java.util.*; import java.util.function.*;import static com.example.test.ConvertTo.primitive;public interface Rand {int MOD 10_0…

5-1 Java 網絡編程

第1關&#xff1a;URL類與InetAddress類 任務描述 本關任務&#xff1a;了解網絡編程基礎知識。 相關知識 為了完成本關任務&#xff0c;你需要掌握&#xff1a;1.URL&#xff1b;2.InetAddress。 URL 統一資源定位符&#xff08;Uniform Resource Locator&#xff0c;縮…

C++單調向量算法:得到山形數組的最少刪除次數

本題的其它解法 C二分算法&#xff1a;得到山形數組的最少刪除次數 題目 我們定義 arr 是 山形數組 當且僅當它滿足&#xff1a; arr.length > 3 存在某個下標 i &#xff08;從 0 開始&#xff09; 滿足 0 < i < arr.length - 1 且&#xff1a; arr[0] < arr[1…

DevOps 事后分析

眾所周知&#xff0c;系統的變化會帶來不穩定&#xff0c;進而引發事故。遷移到 DevOps 使世界各地的組織能夠以更小的增量和更高的頻率進行發布。這降低了特定版本中失敗的風險。另一方面&#xff0c;增加發布數量并不一定會減少待命團隊需要響應的事件數量。 事件響應團隊的…

2023.11.22 homework

七年級數學 五年級數學 也不知道可以教到幾年級&#xff0c;估計很快就教不動了。人生啊。

讀像火箭科學家一樣思考筆記06_初學者之心

1. 專業化是目前流行的趨勢 1.1. 通才&#xff08;generalist&#xff09;是指博而不精之人 1.2. 懂得的手藝越多&#xff0c;反而會家徒四壁 1.2.1. 希臘諺語 1.3. 這種態度代價很大&#xff0c;它阻斷了不同學科思想的交融 2. 組合游戲 2.1. 某個行業的變革可能始于另一…

Pycharm的程序調試

有如下代碼需要進行調試&#xff1a; i 1 while i < 10:print(i)步驟一&#xff1a;設置斷點 步驟二&#xff1a;進入調試視圖 方式1&#xff1a;右鍵單擊編輯區&#xff1a;點擊’Debug模塊名’ ? 方式2&#xff1a;ShiftF9 ? 方式3&#xff1a;單機工具欄上的調試按鈕…

Django報錯:RuntimeError at /home/ 解決辦法

錯誤提示&#xff1a; RuntimeError at /home/ Model class django.contrib.contenttypes.models.ContentType doesnt declare an explicit app_label and isnt in an application in INSTALLED_APPS. 原因剖析&#xff1a; 博主在使用pycharm創建Django項目的時候&#xff0…

vector的簡單模擬實現_C++

目錄 一、vector的數據結構 二、vector的構造 三、vector的增刪查改及空間管理 四、全部代碼 一、vector的數據結構 vector以線性連續空間為基礎來定義數據結構以及擴展功能。vector的兩個迭代器&#xff0c;分別是start和finish&#xff0c;分別指向配置得來的已被使用的空…

網絡滲透測試(wireshark 抓取QQ圖片)

1.打開wireshark 這里我用的wifi連接 所以點開wifi就好 打開wifi之后就開始在本機上進行抓包了 我們先給我們的QQ發送一張圖片&#xff0c;用自己的手機發送給電腦 然后點擊左上角的正方形&#xff0c;停止捕獲抓包 QQ的關鍵詞是oicq&#xff0c;所以我們直接找 打開oicq …

十二、h.264解碼

前言 測試環境&#xff1a; ffmpeg的4.3.2自行編譯版本windows環境qt5.12 完整代碼&#xff1a; H264DncodeThread.h #ifndef H264DNCODETHREAD_H #define H264DNCODETHREAD_H#include <QObject> #include <QThread>extern "C" { #include <libavu…

【論文閱讀筆記】Emu Edit: Precise Image Editing via Recognition and Generation Tasks

【論文閱讀筆記】Emu Edit: Precise Image Editing via Recognition and Generation Tasks 論文閱讀筆記論文信息摘要背景方法結果額外 關鍵發現作者動機相關工作1. 使用輸入和編輯圖像的對齊和詳細描述來執行特定的編輯2. 另一類圖像編輯模型采用輸入掩碼作為附加輸入 。3. 為…

鴻蒙4.0開發筆記之ArkTs語言基礎與基本組件結構(四)

文章聲明&#xff1a;本文關于HarmonyOS系統的部分內容和描述借鑒于華為官網的“HarmonyOS開發者學堂”&#xff0c;有需要的也可以進入官網查看。<HarmonyOS第一課>ArkTS開發語言介紹 一、ArkTs語言介紹 ArkTS是鴻蒙系統&#xff08;HarmonyOS&#xff09;優選的主力應…

設計模式-創建型模式-工廠方法模式

一、什么是工廠方法模式 工廠模式又稱工廠方法模式&#xff0c;是一種創建型設計模式&#xff0c;其在父類中提供一個創建對象的方法&#xff0c; 允許子類決定實例化對象的類型。工廠方法模式是目標是定義一個創建產品對象的工廠接口&#xff0c;將實際創建工作推遲到子類中。…

解讀可解釋性機器學習:理解解釋性基準模型(EBM)

解讀可解釋性機器學習&#xff1a;理解解釋性基準模型&#xff08;EBM&#xff09; 近年來&#xff0c;隨著機器學習模型的復雜性不斷增加&#xff0c;研究人員和從業者對模型的可解釋性提出了更高的要求。可解釋性機器學習&#xff08;Explainable Machine Learning, XAI&…

SHAP - 機器學習模型可解釋性工具

github地址&#xff1a;shap/docs/index.rst at master shap/shap (github.com) SHAP使用文檔&#xff1a;歡迎使用 SHAP 文檔 — SHAP 最新文檔 SHAP介紹 SHAP&#xff08;SHapley Additive exPlanations&#xff09;是一種用于解釋預測結果的方法&#xff0c;它基于Shapley…

實現el-input-number數字框帶單位

實現的效果展示&#xff0c;可以是前綴單位&#xff0c;也可以是后綴單位。實現的思路就是動態修改偽元素 ::before 和 ::after 的 content值 實現二次封裝數字框的代碼如下&#xff1a; <template><el-input-numberref"inputNumber"v-model"inputVal…

opencv-直方圖

直方圖是一種對圖像亮度分布的統計表示&#xff0c;它顯示了圖像中每個灰度級別的像素數量。在OpenCV中&#xff0c;你可以使用cv2.calcHist() 函數計算直方圖。 以下是一個簡單的示例&#xff0c;演示如何計算和繪制圖像的直方圖&#xff1a; import cv2 import numpy as np …