一、介紹
QtAES是一款基於Qt框架的AES(高級加密標準)演算法的實現工具,在數據傳輸、保護隱私等方面有廣泛的應用。該演算法採用了先進的密碼學設計,可實現128、192和256位的加解密操作,以及ECB、CBC、CFB和OFB等加密模式。
二、核心原理
1、加密原理
AES演算法採用分組密碼機制,對明文塊進行逐塊加密。具體而言,AES將每個明文塊分成16個位元組,然後在4 × 4的矩陣上進行操作。首先對矩陣進行一個初始的變換(AddRoundKey),然後進行9輪操作,每輪都包含四個步驟,分別是SubBytes、ShiftRows、MixColumns和AddRoundKey。最後一輪沒有MixColumns步驟,加密結束後,將密文塊鏈接起來。
void AES::EncryptBlock(unsigned char *Block)
{
// ...
for (int i = 0; i < Nb; i++, ptr += 4) {
for (int n = 0; n < 4; n++) {
State[n][i] = Block[ptr + n];
}
}
// ...
AddRoundKey(0);
// ...
for (int round = 1; round < Nr; ++round) {
// ...
SubBytes();
ShiftRows();
MixColumns();
AddRoundKey(round);
// ...
}
// ...
}
2、解密原理
解密與加密過程類似,只是多了一個逆向操作步驟。即先進行一個AddRoundKey,然後進行9輪的逆向操作,分別是InvSubBytes、InvShiftRows、InvMixColumns和AddRoundKey。最後一輪沒有InvMixColumns,解密結束後,將明文塊鏈接起來。
void AES::DecryptBlock(unsigned char *Block)
{
// ...
for (int i = 0; i < Nb; i++, ptr += 4) {
for (int n = 0; n = 1; --round) {
// ...
InvShiftRows();
InvSubBytes();
AddRoundKey(round);
InvMixColumns();
// ...
}
// ...
}
三、安裝與配置
1、安裝
官方提供了源代碼,用戶只需要下載並編譯就能得到QtAES演算法的程序。
$ git clone https://github.com/Lupino/qtaes.git
$ cd qtaes/qtaes/
$ qmake qtaes.pro
$ make
2、配置
用戶可以通過修改源碼中的qtaes_global.h文件來配置演算法加密方式,如打開debug模式、顯示加密過程等。
#define QT_AES_DEBUG
#define QT_AES_NO_QT_NAMESPACE
#define QT_AES_NO_QT_DEBUG_STREAM
#define QT_AES_NO_MEMBER_TEMPLATE_FRIENDS
#define QT_AES_NO_DEBUG_HELPER
#define QT_AES_SEPARATE_QT_RESOURCE_CPP
#define QT_AES_DISABLE_DEPRECATED_BEFORE
四、應用實例
1、文件加密
下面是一個簡單的文件加密程序,實現了對文件的加密和解密操作。
#include <QFile>
#include <QCoreApplication>
#include <QDebug>
#include <qtaes.h>
#define KEY "1234567890123456"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QString fileName = "myfile.txt";
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Failed to open file " << fileName;
return -1;
}
QByteArray data = file.readAll();
file.close();
QByteArray key16 = QByteArray(KEY).leftJustified(16);
QByteArray iv = QByteArray(16, 0);
QByteArray cipher = QtAES::encrypt(data, key16, iv, QtAES::AES_128, QtAES::CBC);
qDebug() << "Cipher: " << QString(cipher.toHex());
QByteArray plain = QtAES::decrypt(cipher, key16, iv, QtAES::AES_128, QtAES::CBC);
qDebug() << "Plain: " << plain;
return 0;
}
2、字元串加密
下面是一個將用戶輸入字元串加密的程序,用戶可選擇加密位數及模式。
#include <QCoreApplication>
#include <QDebug>
#include <qtaes.h>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QString text = "Hello World!";
QByteArray data(text.toUtf8());
QByteArray key16 = QByteArray("1234567890123456").leftJustified(16);
QByteArray iv = QByteArray(16, 0);
QByteArray cipher = QtAES::encrypt(data, key16, iv, QtAES::AES_128, QtAES::CBC);
qDebug() << "Cipher: " << QString(cipher.toHex());
QByteArray plain = QtAES::decrypt(cipher, key16, iv, QtAES::AES_128, QtAES::CBC);
qDebug() << "Plain: " << plain;
return 0;
}
3、網路傳輸加密
下面是一個使用Qt網路模塊實現的加密網路傳輸程序,服務端將用戶輸入的字元串進行加密後通過TCP發送給客戶端。
服務端:
#include <QObject>
#include <QStringList>
#include <QTcpServer>
#include <QTcpSocket>
#include <qtaes.h>
class Server : public QObject
{
Q_OBJECT
public:
explicit Server(QObject *parent = 0)
: QObject(parent), mServer(new QTcpServer(this))
{
connect(mServer, &QTcpServer::newConnection, this, &Server::onNewConnection);
if (!mServer->listen(QHostAddress::Any, 10000)) {
qCritical() << mServer->errorString();
return;
} else {
qDebug() << "Server started...";
}
}
private slots:
void onNewConnection()
{
QTcpSocket *socket = mServer->nextPendingConnection();
connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
connect(socket, &QTcpSocket::readyRead, this, &Server::onReadyRead);
}
void onReadyRead()
{
QByteArray data = qobject_cast<QTcpSocket*>(sender())->readAll();
QByteArray key16 = QByteArray("1234567890123456").leftJustified(16);
QByteArray iv = QByteArray(16, 0);
QByteArray cipher = QtAES::encrypt(data, key16, iv, QtAES::AES_128, QtAES::CBC);
qDebug() << "Cipher: " << QString(cipher.toHex());
qobject_cast<QTcpSocket*>(sender())->write(cipher);
}
private:
QTcpServer *mServer;
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Server server;
return app.exec();
}
客戶端:
#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>
#include <qtaes.h>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QTcpSocket socket;
socket.connectToHost("127.0.0.1", 10000);
if (!socket.waitForConnected()) {
qDebug() << socket.errorString();
return -1;
}
QString text = "Hello World!";
QByteArray data(text.toUtf8());
// Encrypt data
QByteArray key16 = QByteArray("1234567890123456").leftJustified(16);
QByteArray iv = QByteArray(16, 0);
QByteArray cipher = QtAES::encrypt(data, key16, iv, QtAES::AES_128, QtAES::CBC);
qDebug() << "Cipher: " << QString(cipher.toHex());
// Send encrypted data
qint64 bytesWritten = socket.write(cipher);
qDebug() << "Bytes written: " << bytesWritten;
socket.waitForBytesWritten();
// Read encrypted data from server
QByteArray buffer;
while (socket.waitForReadyRead()) {
buffer.append(socket.readAll());
}
qDebug() << "Received: " << buffer;
// Decrypt data
QByteArray plain = QtAES::decrypt(buffer, key16, iv, QtAES::AES_128, QtAES::CBC);
qDebug() << "Plain: " << plain;
return 0;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/233954.html