当前位置: 首页 > news >正文

QT加密和哈希

Qt 提供了对加密和哈希的出色支持,主要通过 QCryptographicHash 类进行哈希计算,并通过 QCA (Qt Cryptographic Architecture) 库或直接集成 OpenSSL 来进行更高级的加密操作(如 AES、RSA 等)。

以下是 Qt 中用于加密和哈希的主要工具和库的详细说明:

1. QCryptographicHash (内置核心功能)

这是 Qt Core 模块的一部分,无需额外依赖。它用于计算数据的加密哈希值,支持多种主流算法。

支持的算法:

  • MD4, MD5

  • SHA1

  • SHA224, SHA256, SHA384, SHA512 (SHA2 家族)

  • SHA3-224, SHA3-256, SHA3-384, SHA3-512 (如果底层的 Qt 编译时支持)

  • Keccak-224, Keccak-256, Keccak-384, Keccak-512

  • BLAKE2b, BLAKE2s

使用方法示例:

cpp

#include <QCryptographicHash>
#include <QDebug>int main() {QByteArray data = "Hello, World!";QByteArray hashResult;// 计算 SHA-256 哈希值hashResult = QCryptographicHash::hash(data, QCryptographicHash::Sha256);// 将结果转换为十六进制字符串以便显示qDebug() << hashResult.toHex();// 对于大文件,可以分块计算QCryptographicHash hashCalculator(QCryptographicHash::Sha256);hashCalculator.addData("Hello, ");hashCalculator.addData("World!");hashResult = hashCalculator.result();qDebug() << hashResult.toHex();return 0;
}

优点:

  • 内置,无需额外库。

  • 简单易用。

  • 性能良好。

缺点:

  • 仅用于哈希,不支持加密/解密、数字签名等。

2. QCA (Qt Cryptographic Architecture)

QCA 是一个基于 Qt 的插件框架,提供了简单易用的 API 来访问许多不同后端的加密功能。它是对 OpenSSL 等底层库的封装,提供了统一的 Qt 风格接口。

功能:

  • 对称加密:AES, DES, 3DES, Blowfish 等。

  • 非对称加密:RSA, DSA 等。

  • 证书和密钥管理 (X.509)。

  • 安全随机数生成。

  • 消息认证码 (HMAC)。

  • SSL/TLS 支持。

安装:
通常需要从源代码编译或通过系统的包管理器安装。

  • Linux (Ubuntu/Debian): sudo apt-get install libqca-qt5-2-dev

  • macOS (Homebrew): brew install qca

  • Windows: 从官方源码或第三方仓库(如 vcpkg)编译。

项目配置 (*.pro 文件):

qmake

QT += core
CONFIG += c++11# 链接 QCA 库
LIBS += -lqca-qt5

使用方法示例 (AES-256-CBC 加密):

cpp

#include <QtCrypto>
#include <QDebug>int main() {// 初始化 QCAQCA::Initializer init;QByteArray plainText = "This is a secret message.";QByteArray key = "my-32-byte-long-key-1234567890ab"; // 必须是 32 字节 for AES-256QByteArray iv(16, '\0'); // 初始向量,16 字节 for AES-CBC// 检查系统是否支持 AES-CBCif (!QCA::isSupported("aes256-cbc-pkcs7")) {qDebug() << "AES-CBC is not supported!";return -1;}// 创建加密器QCA::Cipher cipher("aes256", QCA::Cipher::CBC, QCA::Cipher::DefaultPadding, QCA::Encode, QCA::SymmetricKey(key), QCA::InitializationVector(iv));// 执行加密QCA::SecureArray cipherText = cipher.update(QCA::SecureArray(plainText));cipher.final(); // 确保处理完所有数据if (!cipher.ok()) {qDebug() << "Encryption failed!";return -1;}qDebug() << "Cipher text (hex):" << cipherText.toByteArray().toHex();// 解密QCA::Cipher decipher("aes256", QCA::Cipher::CBC, QCA::Cipher::DefaultPadding, QCA::Decode, QCA::SymmetricKey(key), QCA::InitializationVector(iv));QCA::SecureArray decryptedText = decipher.update(cipherText);decipher.final();if (!decipher.ok()) {qDebug() << "Decryption failed!";return -1;}qDebug() << "Decrypted text:" << decryptedText.toByteArray();return 0;
}

优点:

  • 功能全面,覆盖大部分加密需求。

  • 统一的 Qt 风格 API,易于学习和使用。

  • 支持插件体系,可以切换不同的后端(如 OpenSSL, Botan)。

缺点:

  • 需要单独安装和链接,不是 Qt 官方核心库的一部分。

  • 增加项目依赖。

3. 直接使用 OpenSSL

如果你的项目对性能或特定算法有极高要求,或者你 already familiar with OpenSSL,你也可以直接在 Qt 项目中链接并使用 OpenSSL 的 C API。

安装 OpenSSL:

  • Linux: sudo apt-get install libssl-dev

  • macOS: brew install openssl

  • Windows: 从 OpenSSL 官网下载预编译版本或使用 vcpkg。

项目配置 (*.pro 文件):

qmake

# 链接 OpenSSL 的加密和 SSL 库
unix:!macx {LIBS += -lssl -lcrypto
}macx {# Homebrew 安装的 OpenSSL 路径可能不同INCLUDEPATH += /usr/local/opt/openssl/includeLIBS += -L/usr/local/opt/openssl/lib -lssl -lcrypto
}win32 {# 指定 Windows 下的 OpenSSL 路径INCLUDEPATH += C:/OpenSSL-Win64/includeLIBS += -LC:/OpenSSL-Win64/lib -llibssl -llibcrypto
}

C++ 代码中直接调用 OpenSSL 函数即可。

优点:

  • 功能最强大、最底层、最灵活。

  • 行业标准,文档和社区资源丰富。

缺点:

  • API 是 C 语言风格,复杂且容易出错。

  • 需要手动管理内存和资源,易产生安全漏洞。

  • 平台差异性需要自己处理。

总结

需求推荐方案
快速计算 MD5、SHA 等哈希值QCryptographicHash (内置,首选)
简单的对称加密(AES)、非对称加密(RSA)、证书QCA (API 友好,功能全面)
需要与现有 OpenSSL 代码集成或使用非常见算法直接使用 OpenSSL (强大但复杂)
为应用程序提供 SSL/TLS 通信QSslSocket (Qt Network 模块内置) + QCA (用于证书操作)

文章转载自:

http://bRCuPItg.kdrjd.cn
http://WFBxbP9x.kdrjd.cn
http://cKYppPlR.kdrjd.cn
http://levOBqWL.kdrjd.cn
http://kn6Y3eJG.kdrjd.cn
http://WDdRBoAv.kdrjd.cn
http://caAQQzxG.kdrjd.cn
http://VLSUKc85.kdrjd.cn
http://zNvYYmYh.kdrjd.cn
http://zdFNnkxA.kdrjd.cn
http://6LcSW7ft.kdrjd.cn
http://651nme4P.kdrjd.cn
http://XUZtQ7S1.kdrjd.cn
http://DtITOW9c.kdrjd.cn
http://c2ZLMRn9.kdrjd.cn
http://PHPOL85B.kdrjd.cn
http://l8ZokUnv.kdrjd.cn
http://dbW46hRd.kdrjd.cn
http://I2pEmEz5.kdrjd.cn
http://hOjnT60E.kdrjd.cn
http://QvGzEVlZ.kdrjd.cn
http://EQsk9PmM.kdrjd.cn
http://hkvgkegM.kdrjd.cn
http://taINpWgA.kdrjd.cn
http://9V5yeqqj.kdrjd.cn
http://6676fPZK.kdrjd.cn
http://ID3Lc05D.kdrjd.cn
http://OJgA7Fdu.kdrjd.cn
http://RPqK0eLG.kdrjd.cn
http://76bhhOuD.kdrjd.cn
http://www.dtcms.com/a/383556.html

相关文章:

  • 历史数据分析——中科曙光
  • Dropout:深度学习中的随机丢弃正则化技术
  • 数组存储 · 行主序与列主序 | 应用 / 基地址 / 选择策略
  • 贪心算法应用:最早截止时间优先(EDF)问题详解
  • 每天五分钟深度学习:神经网络的权重参数如何初始化
  • BisenetV1/2网络以及模型推理转换
  • Codeforces Round 1050 (Div. 4)补题
  • 【Java后端】Spring Boot 多模块项目实战:从零搭建父工程与子模块
  • c++命名空间详解
  • 第15课:知识图谱与语义理解
  • HarmonyOS图形处理:Canvas绘制与动画开发实战
  • ffmpeg 有什么用处?
  • 如何重置Gitlab的root用户密码
  • LeetCode算法日记 - Day 41: 数据流的中位数、图像渲染
  • 计算机网络(二)物理层数据链路层
  • 零基础从头教学Linux(Day 33)
  • collections模块
  • 【前端】【高德地图WebJs】【知识体系搭建】图层知识点——>热力图,瓦片图层,自定义图层
  • 关系模型的数据结构
  • Spring Boot 与前端文件上传跨域问题:Multipart、CORS 与网关配置
  • MySQL的事务特性和高可用架构
  • AI重构车载测试:从人工到智能的跨越
  • 前端梳理体系从常问问题去完善-基础篇(html,css,js,ts)
  • 文件查找 find
  • LeetCode 2110.股票平滑下跌阶段的数目
  • 解锁仓储智能调度、运输路径优化、数据实时追踪,全功能降本提效的智慧物流开源了
  • FPGA学习篇——Verilog学习MUX的实现
  • hadoop单机伪分布环境配置
  • Vue3 响应式失效 debug:Proxy 陷阱导致数据更新异常的深度排查
  • el-table的隔行变色不影响row-class-name的背景色