利用QCryptographicHash 加密QString

本文提供了一段使用 Qt 库实现 MD4 加密算法的代码示例。通过此示例,读者可以了解如何利用 QCryptographicHash 类进行数据加密,并掌握从 ASCII 编码到 KOI8-R 编码转换的过程。

直接上代码了   废话不多说了   这是MD4加密   可以自己更改成QCryptographicHash::Md5  或者QCryptographicHash::Sha1

### 使用 Qt 实现对称加密 对于对称加密,在Qt环境中可以利用OpenSSL库来完成具体的加密操作。下面是一个基于AES算法的简单例子,该示例展示了如何使用Qt和OpenSSL来进行字符串的加密与解密。 ```cpp #include <QCoreApplication> #include <QDebug> #include <openssl/aes.h> #include <openssl/rand.h> class AesEncryptor { public: static QByteArray encrypt(const QString &plainText, const QByteArray &key) { AES_KEY aesKey; unsigned char iv[AES_BLOCK_SIZE]; RAND_bytes(iv, sizeof(iv)); AES_set_encrypt_key(reinterpret_cast<const unsigned char*>(key.data()), key.size() * 8, &aesKey); int length = plainText.toUtf8().size(); QByteArray cipherText(length + AES_BLOCK_SIZE, '\0'); AES_cfb128_encrypt((unsigned char*)plainText.toUtf8().data(), (unsigned char*)cipherText.data(), length, &aesKey, iv, nullptr, AES_ENCRYPT); return QByteArray::fromRawData(reinterpret_cast<char*>(iv), sizeof(iv)) + cipherText.left(length); // 将IV附加到密文中以便后续解密时使用 } static QString decrypt(QByteArray encryptedData, const QByteArray &key) { AES_KEY aesKey; unsigned char iv[AES_BLOCK_SIZE]; memcpy(iv, encryptedData.data(), AES_BLOCK_SIZE); AES_set_decrypt_key(reinterpret_cast<const unsigned char*>(key.data()), key.size() * 8, &aesKey); int textLen = encryptedData.size() - AES_BLOCK_SIZE; QByteArray decrypted(textLen, '\0'); AES_cfb128_encrypt(encryptedData.data() + AES_BLOCK_SIZE, reinterpret_cast<unsigned char*>(decrypted.data()), textLen, &aesKey, iv, nullptr, AES_DECRYPT); return QString::fromUtf8(decrypted); } }; ``` 这段代码实现了基本的AES CFB模式下的加解密功能[^2]。 ### 使用 Qt 实现非对称加密 当涉及到非对称加密时,同样可以通过集成OpenSSL库来简化开发过程。这里给出一段简单的RSA公私钥生成以及消息签名验证的例子: ```cpp #include <QFile> #include <QSslSocket> // 包含了用于处理证书和密钥的相关类 #include <QSslError> #include <QSslCertificate> #include <QSslKey> #include <QCryptographicHash> // 创建一对新的 RSA 密钥并保存至文件 void generateRsaKeys(int bitsCount=2048){ QSslKey privateKey(QSsl::PrivateKey,QSsl::Rsa); privatekey.generate(bitsCount,nullptr); QFile filePrivate("private.pem"); if (!filePrivate.open(QIODevice::WriteOnly | QIODevice::Truncate)) qFatal("Unable to open the private key file."); QTextStream out(&filePrivate); out << privateKey.toPem(); QSslKey publicKey(privateKey.publicKey()); QFile filePublic("public.pem"); if (!filePublic.open(QIODevice::WriteOnly | QIODevice::Truncate)) qFatal("Unable to open the public key file."); QTextStream pubOut(&filePublic); pubOut << publicKey.toPem(); } QString signMessageWithPrivateKey(QString message,QSslKey& privateKey){ QCryptographicHash hash(QCryptographicHash::Sha256); hash.addData(message.toLatin1()); QByteArray signature = privateKey.sign(hash.result(),"sha256"); return QString(signature.toBase64()); } bool verifySignatureWithStringAndPublicKey(QString originalString,QString base64EncodedSig,QSslKey& publicKey){ QCryptographicHash hash(QCryptographicHash::Sha256); hash.addData(originalString.toLatin1()); QByteArray decodedSig = QByteArray::fromBase64(base64EncodedSig.toLatin1()); return publicKey.verify(hash.result(),decodedSig,"sha256"); } ``` 上述代码片段提供了创建RSA密钥对的方法,并演示了怎样用私钥签署一条信息及其对应的公开验证方法[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值