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

文章目錄

  • 一、openssl+RSA理論基礎
  • 二、openssl RSA 簽名開發實例

一、openssl+RSA理論基礎

RSA簽名是一種非對稱加密算法,用于在信息傳輸過程中驗證消息的完整性和真實性。以下是RSA簽名的理論基礎的主要知識點:

  1. RSA密鑰對: RSA使用一對公鑰和私鑰,其中公鑰用于加密,私鑰用于解密。簽名是私鑰操作,驗證是公鑰操作。

  2. 數學基礎:

    • 大素數: RSA的安全性基于兩個大素數的乘積難以分解。生成密鑰時,需要選擇兩個大素數。
    • 歐拉函數: RSA使用歐拉函數(Euler’s totient function)來計算與大素數乘積的正整數個數。
  3. 生成密鑰對: 在RSA中,首先需要生成一對公鑰和私鑰。密鑰生成包括選擇兩個大素數、計算模數和選擇公鑰的指數。

  4. 公鑰和私鑰的使用:

    • 加密和解密: 公鑰用于加密,私鑰用于解密。
    • 簽名和驗證: 私鑰用于簽名,公鑰用于驗證簽名。
  5. 數字簽名過程:

    • 消息哈希: 對要簽名的消息進行哈希運算,通常使用SHA-256等哈希算法。
    • 私鑰簽名: 使用私鑰對消息的哈希值進行加密,形成數字簽名。
  6. 數字簽名驗證過程:

    • 消息哈希: 對接收到的消息進行哈希運算,得到消息的哈希值。
    • 公鑰驗證: 使用公鑰對數字簽名進行解密,得到解密后的哈希值。
    • 比較哈希值: 將解密后的哈希值與原始消息的哈希值進行比較。如果相同,則驗證通過。
  7. 安全性考慮: RSA的安全性依賴于大數分解問題的難解性,即從大數的乘積中分解出原始的大素數的難度。選擇足夠大的密鑰長度對抗分解攻擊。

  8. 常見的RSA算法參數:

    • 密鑰長度: 常見的RSA密鑰長度包括1024、2048、3072、4096等。較長的密鑰長度通常提供更高的安全性,但也需要更多的計算資源。
  9. 填充方案: 在實際應用中,為增加安全性,通常使用填充方案(如PKCS#1 v1.5或OAEP)對消息進行填充。

  10. 注意事項: RSA算法的計算量相對較大,因此在實際應用中通常用于加密短消息或對稱密鑰的加密。

理解這些理論基礎有助于正確實現RSA簽名和驗證的過程,并在使用時保證安全性。

二、openssl RSA 簽名開發實例

以下是使用OpenSSL庫進行RSA簽名的簡單C++示例代碼。請注意,這個示例中使用的密鑰長度是2048位,你可以根據需要選擇不同的密鑰長度。

#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;
}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 0;
}

請確保替換private_key.pem為你實際使用的私鑰文件。這個示例中的簽名結果保存在signature數組中,你可以根據實際需要將簽名保存到文件或發送給其他方進行驗證。

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

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

相關文章

pcie-2-rj45速度優化

背景: 目前用iperf3打流傳輸速率達不到要求,千兆實際要求跑到800M以上: 優化方案: 1.優化defconfig: 首先編譯user版本驗證看是否正常 debug版本關閉CONFIG_SLUB_DEBUG_ON宏控。 2.找FAE ,通過更換驅動,或者更新驅動來優化 3.綁定大核: 以8125網卡為例,udp…

【Unity】IBeginDragHandler、IDragHandler 和 IEndDragHandler 介紹

IBeginDragHandler、IDragHandler 和 IEndDragHandler 介紹 IBeginDragHandler、IDragHandler 和 IEndDragHandler 是 Unity 引擎中的三個接口&#xff0c;用于處理 UI 元素的拖放事件。這些接口通常結合使用&#xff0c;構成了 Unity 引擎的拖放事件系統。 IBeginDragHandler…

java--權限修飾符

1.什么是權限修飾符 就是是用來限制類中的成員(成員變量、成員方法、構造器、代碼塊...)能夠被訪問的范圍。 2.權限修飾符有幾種&#xff1f;各自的作用是什么&#xff1f; private<缺省<protected<public(范圍由小到大)

什么年代了,還不會 CI/CD 么?

目錄 什么是 CI/CD&#xff1f; CI/CD 對業務有哪些好處&#xff1f; 一&#xff1a;確保卓越的代碼質量 二&#xff1a;更快的發布速度 → 更快的交付 三&#xff1a;自動化降低成本 四&#xff1a;故障隔離 五&#xff1a;簡化回滾 六&#xff1a;持續反饋 七&#…

設計模式——行為型模式(二)

6.8 迭代器模式 6.8.1 概述 定義:提供一個對象來順序訪問聚合對象中的一系列數據,而不暴露聚合對象的內部表示。 6.8.2 結構 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定義存儲、添加、刪除聚合元素以及創建迭代器對象的接口。具體聚合(ConcreteAggreg…

C# Onnx PP-Vehicle 車輛分析(包含:車輛檢測,識別車型和車輛顏色)

目錄 效果 模型信息 mot_ppyoloe_s_36e_ppvehicle.onnx vehicle_attribute_model.onnx 項目 代碼 下載 其他 C# Onnx PP-Vehicle 車輛分析&#xff08;包含&#xff1a;車輛檢測&#xff0c;識別車型和車輛顏色&#xff09; 效果 模型信息 mot_ppyoloe_s_36e_ppvehi…

009 OpenCV 二值化 threshold

一、環境 本文使用環境為&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在機器視覺應用中&#xff0c;OpenCV的二值化函數threshold具有不可忽視的作用。主要的功能是將一幅灰度圖進行二值化處理&#xff0c;以此大幅降低圖像的數…

ASP.NET Core 啟用CORS

瀏覽器的安全阻止一個域的本地頁面請求另外不同域的本地頁面&#xff0c;這個限制叫同源策略&#xff0c;這個安全特性用來阻止惡意站點從別的網站讀取數據 例如假如我有一個頁面叫A.html https://foo.example/A.html 現在頁面A.html有一個ajax代碼嘗試讀取B.html的HTML的源…

【PyQt】(自定義類)陰影遮罩

寫了一個感覺有些用的小玩具。 用于給控件添加陰影遮罩(強調主控件的同時屏蔽其余控件的點擊) 自定義陰影遮罩Mask&#xff1a; from PyQt5.QtCore import QPoint,QRect,Qt,QPoint,QSize from PyQt5.QtWidgets import QWidget,QLabel,QPushButton,QVBoxLayout from PyQt5.QtGu…

leetcode:合并兩個有序鏈表

題目描述 題目鏈接&#xff1a;21. 合并兩個有序鏈表 - 力扣&#xff08;LeetCode&#xff09; 題目分析 這個算法思路很簡單&#xff1a;就是直接找小尾插 定義一個tail和head&#xff0c;對比兩個鏈表結點的val&#xff0c;小的尾插到tail->next&#xff0c;如果一個鏈表…

每日一題:LeetCode-589.N叉樹的前序遍歷序列構造二叉樹

每日一題系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

企業微信身份驗證

本篇主要是在上一篇獲取第三方憑證基礎上&#xff0c;用戶通過三方網站自定義授權登錄后獲取用戶信息&#xff0c;以實現用戶綁定登錄功能。 構造第三方應用授權鏈接 如果第三方應用需要在打開的網頁里面攜帶用戶的身份信息&#xff0c; 第一步需要構造如下的鏈接來獲取授權c…

馬養殖場建設VR模擬實訓教學平臺具有靈活性和復用性

為保障養殖場生物安全&#xff0c;避免疫病傳播&#xff0c;學生出入養殖場受時間和地域的限制&#xff0c; 生產實習多以參觀為主&#xff0c;通過畜牧企業技術人員的講解&#xff0c;學生被動了解生產過程。為了解決畜牧養殖實訓難的問題&#xff0c;借助VR技術開展畜牧養殖虛…

通過云服務器部署JavaWeb項目

文章目錄 搭建Java運行環境部署項目更改部分項目代碼打包項目把war包上傳到webapps目錄下驗證程序 搭建Java運行環境 搭建環境的部分比較復雜&#xff0c;為了讓大家的思路更加清晰特別總結為一篇博客點擊查看 部署項目 更改部分項目代碼 打包項目 把war包上傳到webapps目錄…

大洋鉆探系列之三IODP 342航次是干什么的?(下)

上文簡要地介紹IODP342航次的總體情況&#xff0c;本文以航次1個鉆孔&#xff08;U1403&#xff09;為例&#xff0c;更為詳細地系統展示大洋鉆探航次的工作和成果。 ?編輯? 站位疊加多波束影像的成果圖見下圖&#xff0c;從圖中的顏色效果可以看出&#xff0c;此多波束的成…

歸并排序算法

文章目錄 歸并排序一、歸并排序思路二、歸并排序算法模板三、題目代碼 歸并排序 一、歸并排序思路 二、歸并排序算法模板 void merge_sort(int q[], int l, int r) {if (l > r) return;int mid l r >> 1;//中間值merge_sort(q, l, mid);merge_sort(q, mid 1, r);…

大數據分析與應用實驗任務九

大數據分析與應用實驗任務九 實驗目的 進一步熟悉pyspark程序運行方式&#xff1b; 熟練掌握pysaprkRDD基本操作相關的方法、函數&#xff0c;解決基本問題。 實驗任務 進入pyspark實驗環境&#xff0c;打開命令行窗口&#xff0c;輸入pyspark&#xff0c;完成下列任務&am…

Redis入門教程

1. 什么是NoSql NoSQL一詞最早出現于1998年&#xff0c;是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關系數據庫。2009年&#xff0c;Last.fm的Johan Oskarsson發起了一次關于分布式開源數據庫的討論&#xff0c;來自Rackspace的Eric Evans再次提出了NoSQL的概念&am…

onnx導出報錯 | IndexError: index_select(): Index is supposed to be a vector

解決方案&#xff1a; 在torch.onnx.export鐘添加do_constant_foldingFalse&#xff0c;如下 torch.onnx.export(model,(None, text),text_fp32_onnx_path,input_names[text],output_names[unnorm_text_features],export_paramsTrue,opset_version13,verboseTrue,do_constant_…

編程參考 - C++ Code Review: 一個計算器的項目

GitHub - jroelofs/calc: Toy Calculator Toy Calculator 1&#xff0c;拿到一個project&#xff0c;第一眼看&#xff0c;沒有配置文件&#xff0c;說明沒有引入持續集成系統&#xff0c;continuous integration system。 2&#xff0c;然后看cmake文件&#xff0c;使用的子…