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

文章目錄

  • 一、RSA簽名校驗
  • 二、RSA簽名校驗開發實例

一、RSA簽名校驗

RSA簽名校驗是一種用于驗證數字簽名的過程,它確保簽名是由擁有相應私鑰的合法實體創建的。以下是RSA簽名校驗的理論知識點:

  1. RSA密鑰對: RSA簽名使用一對公鑰和私鑰。公鑰用于驗證簽名,私鑰用于創建簽名。

  2. 數字簽名過程:

    • 消息哈希: 對要簽名的消息進行哈希運算,通常使用SHA-256等哈希算法,以確保消息的唯一性和完整性。
    • 私鑰簽名: 使用私鑰對消息的哈希值進行加密,形成數字簽名。
  3. 數字簽名校驗過程:

    • 消息哈希: 接收到簽名后,對原始消息進行相同的哈希運算,得到消息的哈希值。
    • 公鑰驗證: 使用簽名者的公鑰對數字簽名進行解密,得到解密后的哈希值。
    • 比較哈希值: 將解密后的哈希值與原始消息的哈希值進行比較。如果相同,則簽名驗證通過,否則失敗。
  4. RSA簽名驗證的數學基礎:

    • RSA簽名驗證的關鍵是使用簽名者的公鑰進行解密。只有持有相應私鑰的實體才能正確地對消息進行簽名。
    • RSA的安全性基于大整數分解問題的難解性。在沒有私鑰的情況下,從簽名中分解出原始哈希值的難度使得其他實體無法偽造合法的簽名。
  5. 填充方案: 在實際應用中,為增加安全性,通常使用填充方案對消息進行填充。常見的填充方案包括PKCS#1 v1.5和OAEP。

  6. 常見錯誤:

    • 簽名長度: 確保簽名長度與RSA密鑰長度相匹配。簽名長度超過密鑰長度時可能導致驗證失敗。
    • 密鑰匹配: 使用正確的公鑰進行驗證,確保公鑰和私鑰匹配。
  7. 安全性注意事項:

    • 使用足夠長的RSA密鑰長度,通常建議使用2048位或更長的密鑰。
    • 定期更新密鑰對,以防止安全性降低。

理解以上理論知識有助于正確實現和使用RSA簽名,并在應用中確保數據的安全性和完整性。

二、RSA簽名校驗開發實例

下面是一個簡單的示例,演示如何使用OpenSSL庫在Linux環境下進行RSA簽名和驗證。在這個示例中,我們使用PEM格式的密鑰對進行簽名和驗證。

#include <iostream>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>// 用于讀取PEM格式的私鑰文件
RSA* readPrivateKey(const char* privateKeyFile) {FILE* file = fopen(privateKeyFile, "r");if (!file) {perror("Error opening private key file");return nullptr;}RSA* rsa = PEM_read_RSAPrivateKey(file, nullptr, nullptr, nullptr);fclose(file);if (!rsa) {ERR_print_errors_fp(stderr);}return rsa;
}// 對消息進行RSA簽名
bool signMessage(const char* message, RSA* privateKey, unsigned char* signature, unsigned int* signatureLength) {EVP_PKEY* pkey = EVP_PKEY_new();EVP_PKEY_set1_RSA(pkey, privateKey);EVP_MD_CTX* ctx = EVP_MD_CTX_new();if (!ctx) {perror("Error creating context");EVP_PKEY_free(pkey);return false;}if (EVP_DigestSignInit(ctx, nullptr, EVP_sha256(), nullptr, pkey) != 1) {perror("Error initializing sign context");EVP_MD_CTX_free(ctx);EVP_PKEY_free(pkey);return false;}if (EVP_DigestSignUpdate(ctx, message, strlen(message)) != 1) {perror("Error updating sign context");EVP_MD_CTX_free(ctx);EVP_PKEY_free(pkey);return false;}if (EVP_DigestSignFinal(ctx, signature, signatureLength) != 1) {perror("Error finalizing sign context");EVP_MD_CTX_free(ctx);EVP_PKEY_free(pkey);return false;}EVP_MD_CTX_free(ctx);EVP_PKEY_free(pkey);return true;
}// 驗證RSA簽名
bool verifySignature(const char* message, RSA* publicKey, const unsigned char* signature, unsigned int signatureLength) {EVP_PKEY* pkey = EVP_PKEY_new();EVP_PKEY_set1_RSA(pkey, publicKey);EVP_MD_CTX* ctx = EVP_MD_CTX_new();if (!ctx) {perror("Error creating context");EVP_PKEY_free(pkey);return false;}if (EVP_DigestVerifyInit(ctx, nullptr, EVP_sha256(), nullptr, pkey) != 1) {perror("Error initializing verify context");EVP_MD_CTX_free(ctx);EVP_PKEY_free(pkey);return false;}if (EVP_DigestVerifyUpdate(ctx, message, strlen(message)) != 1) {perror("Error updating verify context");EVP_MD_CTX_free(ctx);EVP_PKEY_free(pkey);return false;}int result = EVP_DigestVerifyFinal(ctx, signature, signatureLength);EVP_MD_CTX_free(ctx);EVP_PKEY_free(pkey);return (result == 1);
}int main() {// 讀取私鑰const char* privateKeyFile = "private_key.pem";RSA* privateKey = readPrivateKey(privateKeyFile);if (!privateKey) {std::cerr << "Error loading private key" << std::endl;return 1;}// 待簽名的消息const char* message = "Hello, RSA!";// 計算簽名unsigned char signature[2048];  // 2048是RSA密鑰長度unsigned int signatureLength;if (signMessage(message, privateKey, signature, &signatureLength)) {std::cout << "Signature created successfully" << std::endl;} else {std::cerr << "Error creating signature" << std::endl;RSA_free(privateKey);return 1;}// 讀取公鑰const char* publicKeyFile = "public_key.pem";RSA* publicKey = readPrivateKey(publicKeyFile);if (!publicKey) {std::cerr << "Error loading public key" << std::endl;RSA_free(privateKey);return 1;}// 驗證簽名if (verifySignature(message, publicKey, signature, signatureLength)) {std::cout << "Signature verified successfully" << std::endl;} else {std::cerr << "Error verifying signature" << std::endl;}// 釋放資源RSA_free(privateKey);RSA_free(publicKey);return 0;
}

確保替換 private_key.pempublic_key.pem 為實際的私鑰和公鑰文件。這個示例中包含了簽名和驗證兩個步驟。簽名的結果可以被驗證,以確保消息的完整性和真實性。

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

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

相關文章

RPCS3(PlayStation 3游戲模擬器)漢化教程

RPCS3 RPCS3 是一款PlayStation 3 模擬器&#xff0c;可讓 Windows、Linux 或 BSD 系統的用戶運行索尼 PlayStation 3 游戲。 安裝教程 包含 Windows/Linux版本 詳細安裝漢化教程請查看文章 RPCS3&#xff08;PS3模擬器&#xff09;安裝及漢化教程 1.首先下載最新版 RPCS3模…

classifier-free-guidance 擴散模型引導生成

淺談擴散模型的有分類器引導和無分類器引導 - 知乎這篇文章主要比較一下擴散模型的引導生成的三種做法的區別。它們分別是用顯式分類器引導生成的做法&#xff0c;用隱式無分類器引導的做法和用CLIP計算跨模態間的損失來引導生成的做法。 Classifier-Guidance: Diffusion Mode……

瀏覽器是什么

瀏覽器是什么 本文簡要介紹瀏覽器的功能和組成。 瀏覽器&#xff08;Web Browser&#xff09;是一種用于訪問和瀏覽互聯網上的網頁和資源的軟件應用程序。它是用戶與互聯網交互的主要工具之一。 瀏覽器通過使用網絡協議&#xff08;如HTTP、HTTPS等&#xff09;與遠程服務器通…

從0開始學習JavaScript--JavaScript數據類型與數據結構

JavaScript作為一門動態、弱類型的腳本語言&#xff0c;擁有豐富的數據類型和數據結構&#xff0c;這些構建了語言的基礎&#xff0c;為開發者提供了靈活性和表達力。本文將深入探討JavaScript中的各種數據類型&#xff0c;包括基本數據類型和復雜數據類型&#xff0c;并介紹常…

nginx知識梳理及配置詳解

軟件開發全文檔獲取&#xff1a;點我獲取 nginx安裝 #nginx安裝 yum -y install gcc pcre-devel openssl-devel #依賴包 useradd -s /sbin/nologin nginx ./configure --prefix/usr/local/nginx #指定安裝目錄 --usernginx #指定用戶 --with-http_ss…

【數據庫篇】關系模式的表示——(1)問題的提出

1、關系模式的表示 R&#xff1a;表示關系的名字比如&#xff1a;sc選課表&#xff0c;student學生表。 U&#xff1a;表示一個關系模式的所有屬性&#xff0c;比如student表&#xff1a;U&#xff08;sno&#xff0c;sname&#xff0c;sage&#xff0c;ssex&#xff09;。 …

LedControl 庫說明文檔

LedControl 庫最初是為基于 8 位 AVR 處理器的 Arduino 板編寫的。但由于該代碼不使用處理器的任何復雜的內部功能&#xff0c;因此具有高度可移植性&#xff0c;并且應該在任何支持 和 功能的 Arduino&#xff08;類似&#xff09;板上pinMode()運行digitalWrite() 。 單個 M…

C練習題_3

一、單項選擇題&#xff08;本大題共20小題&#xff0c;每小題2分&#xff0c;共40分。在每小題給出的四個備選項中,選出一個正確的答案&#xff0c;并將所選項前的字母填寫在答題紙的相應位置上。 以下正確的C語言自定義標識符是() A. la B. 2a C. do D. a.12 2.在C語言中,錯…

C# 之對象與Xml序列化工具類

寫在前面 一個常用的對象與Xml序列化工具類&#xff0c;使用系統類庫System.Xml&#xff0c;序列化時需要注意只能將對象的公共字段和讀/寫屬性轉換為 XML。不轉換方法、索引器、私有字段或只讀屬性。另外XmlSerializer 類無法序列化ArrayList數組和List<T>數組。 using…

3、Qt使用windeploy工具打包可執行文件

新建一個文件夾&#xff0c;把要打包的可執行文件exe拷貝過來 點擊輸入框&#xff0c;復制一下文件夾路徑 點擊電腦左下角&#xff0c;找到Qt文件夾&#xff0c; 點擊打開 “Qt 5.12.0 for Desktop” &#xff08;我安裝的是Qt 5.12.0版本&#xff09; 輸入“cd bin”&#xff…

springsecurity5.7.x和springsecurity6.x配置文件對比

springsecurity5和springsecurity6如何要實現多種登錄方式&#xff0c;自定義登錄方式都是一樣的操作步驟&#xff0c;主要有四個步驟。 一、自定義登錄用戶實體實現springsecurity中的UserDetails接口 二、自定義登錄用戶實現類實現springsecurity中的UserDetailsService接口 …

vivado產生報告閱讀分析20-QOR

Report QoR Suggestions report_qor_suggestions 命令是處理 QoR 建議對象時使用的主要命令。 QoR 建議對象會創建命令和屬性來改善設計的時序性能&#xff08; 欲知詳情 &#xff0c; 請參閱 QoR 建議 &#xff09; 。 report_qor_suggestions 命令可執行兩項任務 &am…

代碼隨想錄-刷題第七天

454. 四數相加II 題目鏈接&#xff1a;454. 四數相加II 思路&#xff1a;哈希法。使用map集合&#xff0c;key存放ab的值&#xff0c;value存放ab出現的次數。使用兩層循環&#xff0c;循環前兩個數組&#xff0c;找出ab&#xff0c;對map賦值。再用兩層循環&#xff0c;遍歷…

唯創知音WT2605C-A001音頻藍牙語音芯片:小巧體積,高品質音頻播放的創新

在現今的科技繁榮時代&#xff0c;音頻技術作為人類感知世界的重要方式&#xff0c;已經變得越來越重要。唯創知音WT2605C-A001音頻藍牙語音芯片&#xff0c;以其卓越的特性和創新性&#xff0c;正在為音頻技術領域帶來一場革命。 首先&#xff0c;這款芯片以其極小的體積—僅…

chatGPT4機器學習數據后最終保留在機器里的是什么? 機器是怎么產生智能的? TensorFlow沒有直接開發出類似GPT-4這樣的模型

機器學習數據后最終保留在機器里的是機器學習模型。機器學習模型是機器學習系統中的核心&#xff0c;它是機器學習系統能夠進行推理和預測的基礎。 機器學習模型通常由參數組成。參數是機器學習模型的權重和偏差。機器學習系統通過訓練來學習這些參數。訓練是指讓機器學習系統…

webpack 打包優化

在vue.config.js中配置 下載 uglifyjs-webpack-plugin 包 const { defineConfig } require("vue/cli-service"); var path require("path");module.exports defineConfig({transpileDependencies: true,filenameHashing: false, // 去除Vue打包后.cs…

0003Java程序設計-ssm基于微信小程序的家教信息管理系統

文章目錄 摘要目 錄系統實現開發環境 編程技術交流、源碼分享、模板分享、網課分享 企鵝&#x1f427;裙&#xff1a;776871563 摘要 本文講述了基于微信小程序的家教信息管理系統的設計與實現。結合線上管理的特點&#xff0c;分析了家教信息管理系統的現狀&#xff0c;給出…

外匯天眼:香港監管機構對AMTD Global Markets Limited啟動法律訴訟

香港證監會&#xff08;SFC&#xff09;已經啟動了法律程序&#xff0c;要求首次審裁法院調查AMTD Global Markets Limited&#xff08;AMTD&#xff0c;目前以orientiert XYZ Securities Limited為名&#xff09;及其前高管在與首次公開發行&#xff08;IPO&#xff09;相關的…

【經典小練習】修改文件中的數據

文章目錄 &#x1f339;例子&#x1f33a;思路&#x1f6f8;方法一?報錯解決 &#x1f6f8;方法二 &#x1f339;例子 文本文件中有下面的數據 2-1-9-4-7-8 將文件中的數據進行排序&#xff0c;變成下面的數據 1-2-4-7-8-9 &#x1f33a;思路 要對這些數據進行排序&#xf…

智慧樓宇可視化視頻綜合管理系統,助力樓宇高效安全運行

隨著互聯網技術的進步和發展&#xff0c;智能化的樓宇建設也逐步成為人們選擇辦公場所是否方便的一個重要衡量因素。在智能化樓宇中&#xff0c;安全管理也是重要的一個模塊。得益于互聯網新興技術的進步&#xff0c;安防視頻監控技術也得到了快速發展并應用在樓宇的安全管理中…