【window QT開發】簡易的對稱密鑰加解密工具(包含圖形應用工具和命令行工具)

前言

? ? ? ? 項目開發時,配置文件中某些信息不適合直接明文顯示,本文提供基于對稱密鑰的AES-256算法的加解密工具,可集成到項目中。

AES講解

以下是我分享的一個在國產信創系統(Linux)下使用openssl實現AES加解密的博文

對稱加密--AES加解密

本文使用的aes-256是高安全性的算法,對稱密鑰不泄露,別人很難破解。

QT圖形應用效果圖

內容和對稱密鑰都支持中英文。

命令行工具效果圖

命令行工具,方便項目中通過調用第三方應用獲取打印信息來獲取加/解密的結果。

源碼講解

本文的源碼引用的是第三方源碼QT-AES,只需要把以下兩個文件拷貝到QT項目與main.cpp同級目錄即可

另外,編寫一個實現調用功能的頭文件(qaes_openssl.h),如下所示

#ifndef QAES_OPENSSL_H
#define QAES_OPENSSL_H
// qaes_openssl.h
#include <QByteArray>
#include <QCryptographicHash>
#include <QRandomGenerator>
#include "qaesencryption.h"class QAesOpenssl {
public:static QByteArray encrypt(const QByteArray &data, const QString &password) {// 生成隨機saltQByteArray salt = generateSalt(8);// 生成密鑰和IVKeyIV keyiv = generateKeyIV(password.toUtf8(), salt);// 使用修正后的QAESEncryption接口QAESEncryption aes(QAESEncryption::AES_256, QAESEncryption::CBC, QAESEncryption::PKCS7);QByteArray encrypted = aes.encode(data, keyiv.key, keyiv.iv);// 組合Salted頭return ("Salted__" + salt + encrypted).toBase64();}static QByteArray decrypt(const QByteArray &data, const QString &password) {QByteArray decoded = QByteArray::fromBase64(data);// 提取salt和密文if (!decoded.startsWith("Salted__") || decoded.size() < 16) {return QByteArray();}QByteArray salt = decoded.mid(8, 8);QByteArray cipherData = decoded.mid(16);// 生成密鑰和IVKeyIV keyiv = generateKeyIV(password.toUtf8(), salt);QAESEncryption aes(QAESEncryption::AES_256, QAESEncryption::CBC, QAESEncryption::PKCS7);QByteArray decrypted = aes.decode(cipherData, keyiv.key, keyiv.iv);// 手動移除PKCS#7填充(核心修復)const int AES_BLOCK_SIZE = 16;if (!decrypted.isEmpty()) {char lastChar = decrypted.back();if (lastChar > 0 && lastChar <= AES_BLOCK_SIZE) {if (decrypted.right(lastChar).count(lastChar) == lastChar) {decrypted.chop(lastChar);}}}return decrypted;}private:struct KeyIV {QByteArray key;QByteArray iv;};static QByteArray generateSalt(int length) {QByteArray salt;salt.resize(length);QRandomGenerator::global()->fillRange(reinterpret_cast<quint32*>(salt.data()),length / sizeof(quint32));return salt;}static KeyIV generateKeyIV(const QByteArray &password, const QByteArray &salt) {QByteArray keyivData;QByteArray md5Hash;QCryptographicHash md5(QCryptographicHash::Md5);const int keySize = 32; // AES-256const int ivSize = 16;  // IV for CBCconst int required = keySize + ivSize;while (keyivData.size() < required) {md5.reset();if (!md5Hash.isEmpty()) {md5.addData(md5Hash);}md5.addData(password);md5.addData(salt);md5Hash = md5.result();keyivData.append(md5Hash);}return {keyivData.left(keySize),keyivData.mid(keySize, ivSize)};}
};
#endif // QAES_OPENSSL_H

引用代碼如下

#include "qaes_openssl.h"QString password=ui->pwd_lineEdit->text();
QString plainText=ui->src_textEdit->toPlainText();{// 加密QByteArray encrypted = QAesOpenssl::encrypt(plainText.toUtf8(), password);QString encryptedstr = QString::fromUtf8(encrypted);//qDebug() << "Encrypted Base64:" << encryptedstr;}{// 解密QByteArray decrypted = QAesOpenssl::decrypt(plainText.toUtf8(), password);QString decryptedstr = QString::fromUtf8(decrypted);qDebug() << "decrypted Base64:" << decryptedstr;
}

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

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

相關文章

「極簡」扣子(coze)教程 | 小程序UI設計進階(二)!讓系統動起來,“禁用”,“加載”狀態設置

大家好&#xff0c;上一期大師兄通過一個例子來介紹一下扣子界面中“可見性”的應用。今天大師兄想再進一步介紹控件中的其他一些重要的屬性。 扣子&#xff08;coze&#xff09;編程 「極簡」扣子(coze)教程 | 小程序UI設計進階&#xff01;控件可見性設置 「極簡」扣子(coze…

前端三件套之html詳解

目錄 一 認識 二 標簽的分類 三 標簽 body標簽 標題標簽 段落標簽 換行標簽 水平分割線 文本格式化標簽 圖片標簽 音頻標簽 鏈接標簽 列表標簽 表格標簽 表單標簽 input標簽 下拉菜單標簽 textarea文本域標簽 label標簽 語義化標簽 button標簽 字符實體 …

Google Play 賬號創建及材料準備

1&#xff1a;注冊一個關聯Google Play賬號的Google賬號&#xff0c;關聯郵箱進行自動轉發 2&#xff1a;準備一張Visa、Master、JCB、運通卡或Discover等美國信用卡或全球付虛擬信用卡&#xff0c;用來支付25美金的GP賬號注冊費 3&#xff1a;為避免出現關聯原因被封&#x…

Pycharm和Flask的學習心得(4和5)

一&#xff1a;認識路由&#xff1a; &#xff08;1&#xff09;&#xff1a;接受請求的類型&#xff1a; app.route(hello ,methods [GET ,POST]) 請求類型主要有兩種(常用)&#xff1a;GET 和 POST ; GET: 直接輸入的網址&#xff08;url訪問的就是GET請求&#xff09; …

DeepSeek 賦能智能電網:從技術革新到全場景應用實踐

目錄 一、智能電網的發展現狀與挑戰二、DeepSeek 技術解析2.1 DeepSeek 技術原理2.2 DeepSeek 技術優勢 三、DeepSeek 在智能電網中的具體應用3.1 設備管理智能化3.2 電網運行優化3.3 客戶服務提升3.4 規劃建設智能化3.5 經營管理高效化3.6 辦公輔助便捷化 四、DeepSeek 在智能…

MFC 編程中 OnInitDialog 函數

核心作用 對話框初始化入口 &#xff1a;創建完成后第一個執行的函數。是對話框的起點。控件操作安全期 &#xff1a;此時所有控件已創建完成。可以安全地進行控件的初始化、屬性設置等操作。界面布局最佳時機 &#xff1a;窗口顯示前完成初始化設置。可以進行布局調整、數據初…

前端地圖數據格式標準及應用

前端地圖數據格式標準及應用 坐標系EPSGgeojson標準格式基于OGC標準的地圖服務shapefile文件3D模型數據常見地圖框架 坐標系EPSG EPSG&#xff08;European Petroleum Survey Group&#xff09;是一個國際組織&#xff0c;負責維護和管理地理坐標系統和投影系統的標準化編碼 E…

Python爬蟲(35)Python爬蟲高階:基于Docker集群的動態頁面自動化采集系統實戰

目錄 一、技術演進與行業痛點二、核心技術棧深度解析2.1 動態渲染三件套2.2 Docker集群架構設計2.3 自動化調度系統 三、進階實戰案例3.1 電商價格監控系統1. 技術指標對比2. 實現細節 3.2 新聞聚合平臺1. WebSocket監控2. 字體反爬破解 四、性能優化與運維方案4.1 資源消耗對比…

04-jenkins學習之旅-java后端項目部署實踐

1、創建被管理項目 2、構建流程說明 jenkins其實就是將服務部署拆分成了&#xff1a; 1、拉取代碼(git) 2、打包編譯 3、自定義腳本(jar復制、執行啟動腳本) 4、部署成功后的一些通知等 3、demo配置 3.1、General 3.2 源碼管理 添加用戶名密碼方式如下圖 3.2.1 常見錯誤(r…

科研經驗貼:AI領域的研究方向總結

一、數據集&#xff08;Dataset&#xff09; 定義&#xff1a; 用于訓練、驗證和測試模型的樣本集合&#xff0c;通常包含輸入特征&#xff08;如圖像、文本&#xff09;和對應標簽&#xff08;如類別、回歸值&#xff09;。 關鍵作用&#xff1a; 數據劃分&#xff1a; 訓練…

Android 網絡全棧攻略(四)—— 從 OkHttp 攔截器來看 HTTP 協議一

上一篇我們詳解了 OkHttp 的眾多配置&#xff0c;本篇來看 OkHttp 是如何通過責任鏈上的內置攔截器完成 HTTP 請求與響應的&#xff0c;目的是更好地深入理解 HTTP 協議。這仍然是一篇偏向于協議實現向的文章&#xff0c;重點在于 HTTP 協議的實現方法與細節&#xff0c;關于責…

免費AI工具整理

1、NVIDIA models ALL&#xff1a;Try NVIDIA NIM APIs example&#xff1a;llama-3.1-405b-instruct Model by Meta | NVIDIA NIM 2、文心一言 文心一言 3、納米AI 納米AI搜索 4、其他 ChatGPT 鏡像網址&#xff08;5月持續更新&#xff09; - 最優網址

C++ std::find() 函數全解析

std::find()是C標準庫中用于線性查找的基礎算法&#xff0c;屬于<algorithm>頭文件&#xff0c;可應用于任何支持迭代器的容器。 一、函數原型與參數 template< class InputIt, class T > InputIt find( InputIt first, InputIt last, const T& value );??…

MySQL--day6--單行函數

&#xff08;以下內容全部來自上述課程&#xff09; 單行函數 1. 內置函數及分類 單行函數聚合函數&#xff08;或分組函數&#xff09; 1.1 單行函數特點 操作數據對象接受參數返回一個結果只對一行進行變換每行返回一個結果可以嵌套參數可以是一列或一個值 2. 數值函…

GO語言學習(九)

GO語言學習&#xff08;九&#xff09; 上一期我們了解了實現web的工作中極為重要的net/http抱的細節講解&#xff0c;大家學會了實現web開發的一些底層基礎知識&#xff0c;在這一期我來為大家講解一下web工作的一個重要方法&#xff0c;&#xff1a;使用數據庫&#xff0c;現…

解決MybatisPlus使用Druid1.2.11連接池查詢PG數據庫報Merge sql error的一種辦法

目錄 前言 一、問題重現 1、環境說明 2、重現步驟 3、錯誤信息 二、關于LATERAL 1、Lateral作用場景 2、在四至場景中使用 三、問題解決之道 1、源碼追蹤 2、關閉sql合并 3、改寫處理SQL 四、總結 前言 在博客&#xff1a;【寫在創作紀念日】基于SpringBoot和PostG…

嵌入式學習--江協51單片機day8

這個本來應該周末寫的&#xff0c;可是一直想偷懶&#xff0c;只能是拖到周一了&#xff0c;今天把51結個尾&#xff0c;明天開始學32了。 學習內容LCD1602&#xff0c;直流電機&#xff0c;AD/DA&#xff0c;紅外遙控 LCD1602 內部的框架結構 屏幕小于數據顯示區&#xff…

HUAWEI華為MateBook D 14 2021款i5,i7集顯非觸屏(NBD-WXX9,NbD-WFH9)原裝出廠Win10系統

適用型號&#xff1a;NbD-WFH9、NbD-WFE9A、NbD-WDH9B、NbD-WFE9、 鏈接&#xff1a;https://pan.baidu.com/s/1qTCbaQQa8xqLR-4Ooe3ytg?pwdvr7t 提取碼&#xff1a;vr7t 華為原廠WIN系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、系統屬性專屬LOGO標志、Office…

【Python】Python 裝飾器的用法總結

在 Python 中&#xff0c;裝飾器&#xff08;Decorator&#xff09; 是一種設計模式&#xff0c;用于在不修改函數或類代碼的情況下動態地擴展其功能。裝飾器廣泛應用于日志記錄、性能監控、權限驗證等場景&#xff0c;提供了一種簡潔優雅的方式來“包裹”現有的代碼。本文將介…

【C++】控制臺小游戲

移動&#xff1a;W向上&#xff0c;S上下&#xff0c;A向左&#xff0c;D向右 程序代碼&#xff1a; #include <iostream> #include <conio.h> #include <windows.h> using namespace std;bool gameOver; const int width 20; const int height 17; int …