Qt Rsa 加解密方法使用(pkcs1, pkcs8, 以及文件存儲和內存存儲密鑰)

Qt RSA 加解密 完整使用

密鑰格式:

  • pkcs#1
  • pkcs#8

如何區分密鑰對是PKCS1還是PKCS8?

通常PKCS1密鑰對的開始部分為:-----BEGIN RSA PRIVATE KEY----------BEGIN RSA PUBLIC KEY-----。而PKCS8密鑰對的開始部分為:-----BEGIN PRIVATE KEY----------BEGIN ENCRYPTED PRIVATE KEY----------BEGIN PUBLIC KEY-----

加解密方式:

  • 文件形式存儲密鑰
  • 內存形式存儲密鑰
#ifndef ENCIPHERMENT_H
#define ENCIPHERMENT_H
#include<QObject>
#include"openssl/rsa.h"
#include"openssl/pem.h"class RsaEncipherMent
{
public:explicit RsaEncipherMent();//密鑰 以內存的形式存儲QByteArray BioEncrypt(const QByteArray &PlainData, const QByteArray &Pubkey,bool pkcs1 = false);QByteArray BioDecrypt(const QByteArray &PlainData, const QByteArray &Prikey);//密鑰 以文件的形式存儲QByteArray FileEncrypt(const QByteArray &PlainData, const QByteArray &pem_path,bool pkcs1 = false);QByteArray FileDecrypt(const QByteArray &PlainData, const QByteArray &pem_path);//內存形式 pkcs8const QString public_key = "-----BEGIN PUBLIC KEY-----\nMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALmxDatSZ6vOkzQfXRUlJoR8mbiGOM7FxRX8WolGY3z/tT2CxLE0TFLDz2DcGMKBo68MNfkpCF0+IsH9DimfHFMCAwEAAQ==\n-----END PUBLIC KEY-----\n";const QString private_key = "-----BEGIN PRIVATE KEY-----\nMIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAubENq1Jnq86TNB9d FSUmhHyZuIY4zsXFFfxaiUZjfP+1PYLEsTRMUsPPYNwYwoGjrww1+SkIXT4iwf0OKZ8cUwIDAQABAkAoTg7qfdN0zjzTVm9s1Ih8v1LaY3/XGcRClmjMXRPhIHynq98B/03mBZ+OXDSGjOtvlLD2Tv70HmwBEHigMn3xAiEA7Vr603otCwBOfy8Pa1/gQqQSWBMLP4oUVw6Rwz6qcUsCIQDIRyhsNI6lBEpF9G+QxneE/agG6bLKaA82cn9K1XKkGQIhAJRTpamgkSNt1qAeTZmBOckLdTc6922GoX1h6m9D6wmPAiEAucDFzRYx9vszqA4+K5jn4YEiBsdZ/EDnWyh2x4GRAoECIAY4wKOCodXaL3W76zaqaiF4xlkOh2/vAMoVirqRNdGA\n-----END PRIVATE KEY-----\n";//內存形式 pkcs1const QString public_keypkcs1 = "-----BEGIN RSA PUBLIC KEY-----\nMEgCQQDBTs84K32azWD5PWx44QulreGUwZc1b4iOkwV8EBTw9w9P7vbfA0VN5W27A7ebhEJa287hm1hH/24mE1X5EWUxAgMBAAE=\n-----END RSA PUBLIC KEY-----\n";const QString private_keypkcs1 = "-----BEGIN RSA PRIVATE KEY-----\nMIIBOwIBAAJBAMFOzzgrfZrNYPk9bHjhC6Wt4ZTBlzVviI6TBXwQFPD3D0/u9t8DRU3lbbsDt5uEQlrbzuGbWEf/biYTVfkRZTECAwEAAQJAK3WaZNhyPrFZ0e8bSfnecnsrMhRr+FmA6/zlyMSc0Kd1/LzlTrCp90vJrEUbLio8+BBBBu5QvqCJDCatNRvYAQIhAPwS5bJTp821w6MWz6CTdn+2NNl/6OuOEU7vFMhojnrBAiEAxFGXtJWKFvTZHQgYTMRWQ1DHvj+MsTxtYWabJUjotnECIQCwCl6B+KxjHIKhfkfIY9PJAy3Li+nV v+TUlGGWSHbgwQIhAME+B3SMVjcuoKBBHZpDER6F33fXmifD8W8Uztauo9MhAiA0r1z3wnJNvyQuxduIhh6G9cCX6RoFXW9cKA3mIy/yHA==\n-----END RSA PRIVATE KEY-----\n";
};
#endif // ENCIPHERMENT_H
#include"EncipherMent.h"
extern "C"
{
#include <openssl/applink.c>
};
RsaEncipherMent::RsaEncipherMent()
{}QByteArray RsaEncipherMent::BioEncrypt(const QByteArray &PlainData, const QByteArray &Pubkey, bool pkcs1 /*= false*/)
{BIO* pKeyBio = BIO_new_mem_buf(Pubkey.data(), Pubkey.size());if (pKeyBio == NULL){return "";}RSA* pRsa = RSA_new();if (pkcs1){//pkcs#1pRsa = PEM_read_bio_RSAPublicKey(pKeyBio, &pRsa, NULL, NULL);}else{//pkcs#8pRsa = PEM_read_bio_RSA_PUBKEY(pKeyBio, &pRsa, NULL, NULL);}if (pRsa == NULL){BIO_free_all(pKeyBio);return "";}int nLen = RSA_size(pRsa);QByteArray strEncryptData = "";strEncryptData.resize(nLen); // 調整輸出buf大小//加密int nSize = RSA_public_encrypt(PlainData.size(),(uchar*)PlainData.data(),(uchar*)strEncryptData.data(),pRsa,RSA_PKCS1_PADDING);//釋放內存BIO_free_all(pKeyBio);RSA_free(pRsa);return strEncryptData.toBase64();
}QByteArray RsaEncipherMent::BioDecrypt(const QByteArray &PlainData, const QByteArray &Prikey)
{BIO* pKeyBio = BIO_new_mem_buf(Prikey.data(), Prikey.size());if (pKeyBio == NULL){return "";}RSA* pRsa = RSA_new();pRsa = PEM_read_bio_RSAPrivateKey(pKeyBio, &pRsa, NULL, NULL);if (pRsa == NULL){BIO_free_all(pKeyBio);return "";}int nLen = RSA_size(pRsa);QByteArray strEncryptData = "";strEncryptData.resize(nLen);//解密int nSize = RSA_private_decrypt(PlainData.size(),(uchar*)PlainData.data(),(uchar*)strEncryptData.data(),pRsa,RSA_PKCS1_PADDING);//釋放內存BIO_free_all(pKeyBio);RSA_free(pRsa);return strEncryptData.mid(0,nSize);
}QByteArray RsaEncipherMent::FileEncrypt(const QByteArray &PlainData, const QByteArray &pem_path,bool pkcs1)
{RSA * rsa = NULL;FILE* fp = NULL;char* en = NULL;if((fp = fopen((char*)pem_path.data(),"rb")) == NULL){return "";}if(pkcs1){if((rsa = PEM_read_RSAPublicKey(fp, NULL, NULL, NULL)) == NULL){return "";}}else{if((rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL)) == NULL){return "";}}int rsa_len = RSA_size(rsa);QByteArray encode;encode.resize(rsa_len);int reasult = RSA_public_encrypt(PlainData.size(), (unsigned char*)PlainData.data(), (unsigned char*)encode.data(), rsa, RSA_PKCS1_PADDING);if(reasult == -1){return "";}RSA_free(rsa);return encode.toBase64();}QByteArray RsaEncipherMent::FileDecrypt(const QByteArray &PlainData, const QByteArray &pem_path)
{RSA *rsa = NULL;FILE*fp = NULL;char*de = NULL;int rsa_len = 0;if((fp = fopen(pem_path.data(),"rb")) == NULL){return "read fail";}if((rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL)) == NULL){return NULL;}rsa_len = RSA_size(rsa);QByteArray decode;decode.resize(rsa_len);int reasult = RSA_private_decrypt(PlainData.size(), (unsigned char*)PlainData.data(), (unsigned char*)decode.data(), rsa, RSA_PKCS1_PADDING);if( reasult==-1){return "";}RSA_free(rsa);fclose(fp);return decode.mid(0,reasult);}

密鑰生成地址: https://uutool.cn/rsa-generate/

代碼地址: https://github.com/heisai/RsaEncipherMent/tree/master

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

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

相關文章

基于Springboot+mybatis+mysql+jsp招聘網站

基于Springbootmybatismysqljsp招聘網站 一、系統介紹二、功能展示四、其他系統實現五、獲取源碼 一、系統介紹 項目類型&#xff1a;Java EE項目 項目名稱&#xff1a;基于SPringBoot的照片網站 項目架構&#xff1a;B/S架構 開發語言&#xff1a;Java語言 前端技術&…

Swagger Array 逐步解密:帶你簡化開發工作

Swagger 允許開發者定義 API 的路徑、請求參數、響應和其他相關信息&#xff0c;以便生成可讀性較高的文檔和自動生成客戶端代碼。而 Array &#xff08;數組&#xff09;是一種常見的數據結構&#xff0c;用于存儲和組織多個相同類型的數據元素。數組可以有不同的維度和大小&a…

C++初學教程三

目錄 一、運算符 一、自增自減運算符 二、位運算符 三、關系運算符

情緒管理法則

感受情緒&#xff0c;聆聽情緒&#xff0c;接納情緒&#xff0c;管理情緒&#xff0c;將自己從黑暗中拯救出來 感受情緒的價值&#xff0c;了解情緒產生的原因 其實情緒沒有好壞之分&#xff0c;負面情緒是人體自我保護的產物 改變認知方式&#xff0c;做情緒的主人 典型案例…

軌道電流檢測IC——FP355,助力蓄電池充電器、SPS(適配器)、電池管理系統、多口快充充電器的優雅升級

目錄 一、FP355概述 二、FP355特點 三、FP355應用 隨著移動設備的普及和人們對電力需求的不斷增長&#xff0c;充電器的安全性和充電效率成為了重要的關注點。 作為一種能夠精確檢測電流的集成電路&#xff0c;軌道電流檢測IC——FP355是個不錯的選擇。它不僅廣泛應用于蓄電…

SpringBoot集成Spring Security+jwt+kaptcha驗證(簡單實現,可根據實際修改邏輯)

參考文章 【全網最細致】SpringBoot整合Spring Security JWT實現用戶認證 需求 結合jwt實現登錄功能&#xff0c;采用自帶/login接口實現權限控制 熟悉下SpringSecurity SpringSecurity 采用的是責任鏈的設計模式&#xff0c;是一堆過濾器鏈的組合&#xff0c;它有一條很…

P5743 【深基7.習8】猴子吃桃

題目描述 一只小猴買了若干個桃子。第一天他剛好吃了這些桃子的一半&#xff0c;又貪嘴多吃了一個&#xff1b;接下來的每一天它都會吃剩余的桃子的一半外加一個。第 n n n 天早上起來一看&#xff0c;只剩下 1 1 1 個桃子了。請問小猴買了幾個桃子&#xff1f; 輸入格式 …

鴻蒙(HarmonyOS)應用開發——http的使用

在使用app的時候&#xff0c;不可能將所有信息都存儲在app中&#xff0c;是需要鏈接互聯網&#xff0c;從服務端獲取數據。 #mermaid-svg-nP3gq7NrsyR2Df4i {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nP3gq7Nrs…

03_W5500TCP_Client

上一節我們完成了W5500網絡的初始化過程&#xff0c;這節我們進行TCP通信&#xff0c;w5500作為TCP客戶端與電腦端的TCP_Server進行通信。 目錄 1.TCP通信流程圖&#xff1a; tcp的三次握手&#xff1a; tcp四次揮手&#xff1a; 2.代碼分析&#xff1a; 3.測試&#xff1a…

Python游戲測試工具自動化遍歷游戲中所有關卡

場景 游戲里有很多關卡&#xff08;可能有幾百個了&#xff09;&#xff0c;理論上每次發布到外網前都要遍歷各關卡看看會不會有異常&#xff0c;上次就有玩家在打某個關卡時卡住不動了&#xff0c;如果每個關卡要人工遍歷這樣做會非常的耗時&#xff0c;所以考慮用自動化的方…

C語言第十六集(后續)(結構體)

1.匿名結構體(即不寫結構體名)只能用一次, 而且匿名結構體寫法特別危險 兩個匿名結構體盡管內容完全相同,但編譯器仍然認為二位是不相同的類型 結構的特殊聲明搜 2.結構體自己給自己里面包含一個結構體變量((此結構體就是當前所處的這個結構體))指針是沒有問題的,但是 結構…

AI專題報告:2022年中國人工智能產業研究報告

今天分享的AI系列深度研究報告&#xff1a;《AI專題報告&#xff1a;2022年中國人工智能產業研究報告》。 &#xff08;報告出品方&#xff1a;艾瑞咨詢&#xff09; 報告共計&#xff1a;112頁 人工智能參與社會建設的千行百業 價值性、通用性、效率化為產業發展戰略方向 …

淘寶API接口系列丨商品詳情數據接口丨關鍵詞搜索商品列表接口丨商品評論,銷量接口

要對接淘寶API接口&#xff0c;可以按照以下步驟進行操作&#xff1a; 注冊成為淘寶開放平臺開發者&#xff0c;并創建一個應用。在應用創建頁面&#xff0c;需要填寫應用的名稱、描述等信息&#xff0c;并設置應用的API權限等級。獲取App Key和App Secret。在應用創建后&…

淘寶商品詳情:獲取海量優質商品信息

淘寶商品詳情接口&#xff0c;也稱為淘寶商品詳情API&#xff0c;是一個用于獲取淘寶商品詳情的接口。它可以幫助開發者快速獲取淘寶商品信息&#xff0c;從而構建自己的電商應用程序。 在開始使用淘寶商品詳情接口之前&#xff0c;首先需要了解以下幾個概念和步驟&#xff1a…

jira創建用例,與任務關聯

項目用的jira&#xff0c;但之前的用例放在禪道上&#xff0c;或者歸檔于svn&#xff0c;都不是很好用&#xff0c;所以研究了下jira的用法 1、下載插件&#xff1a; synapseRT - Test management and QA in JIRA 完成后在tab會多出一個test 2、常用的功能 1、建立用例&#…

【華為OD題庫-081】最長的元音子串長度-Java

題目 題目描述: 定義當一個字符串只有元音字母一(a,e,i,o,u,A,E,l,O,U)組成&#xff0c; 稱為元音字符串&#xff0c;現給定一個字符串&#xff0c;請找出其中最長的元音字符串&#xff0c;并返回其長度&#xff0c;如果找不到請返回0&#xff0c; 字符串中任意一個連續字符組成…

Gitlab+GitlabRunner搭建CICD自動化流水線將應用部署上Kubernetes

文章目錄 安裝Gitlab服務器準備安裝版本安裝依賴和暴露端口安裝Gitlab修改Gitlab配置文件訪問Gitlab 安裝Gitlab Runner服務器準備安裝版本安裝依賴安裝Gitlab Runner安裝打包工具安裝docker安裝java17安裝maven 注冊Gitlab Runner 搭建自動化部署準備SpringBoot項目添加一個Co…

驗證碼的多種生成策略

&#x1f60a; 作者&#xff1a; 瓶蓋子io &#x1f496; 主頁&#xff1a; 瓶蓋子io-CSDN博客 第一種 a.導入依賴 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</ver…

【數據結構】字典樹(Trie樹)算法總結

知識概覽 Trie&#xff1a;高效地存儲和查找字符串集合的數據結構數字、漢字可以用二進制位來存 例題展示 題目鏈接 Trie字符串統計&#xff1a; https://www.acwing.com/problem/content/837/ 代碼 #include <cstdio>const int N 100010;int son[N][26], cnt[N],…

zxjy003- Spring Cloud后端工程搭建

1、創建 sprigboot 工程 guli-parent groupId &#xff1a; com.atguigu artifactId &#xff1a; guli-parent 2.刪除src目錄 3.配置pom.xml 修改版本為 &#xff1a;2.2.1.RELEASE<artifactId> 節點后面添加 pom類型 全部依賴&#xff0c;復制下面的即可&#xff0c…