目录
前言
使用Qt设计的一款开源轻量级文件加解密软件,该软件参考多个类似的开源项目,不依赖其他特定的第三方库,完全使用Qt组件构建而成。
部分代码展示
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "fileencryption.h"
#include "utility/progressbutton.h"
#include "utility/passwordeditor.h"
#include <QIcon>
#include <QWidget>
#include <QThread>
#include <QPointer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
signals:
void emitProgress(int value);
void backChoose();
protected:
void mousePressEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event)override;
private:
void initForm();
void initConnection();
void startEncryptFile();
void startEncryptDir();
void startDecryptFile();
void startDecryptDir();
bool dirZiper();
bool dirUnZiper();
private slots:
void switchMainPage();
void getFilePath();
void getDirPath();
void startCryption();
private:
int b_state=0; //EMPTY=0,FILE=1,DIR=2
QVector<QIcon> picPath{QIcon(":/new/prefix1/image/Adding.png"),
QIcon(":/new/prefix1/image/fileicon.png"),
QIcon(":/new/prefix1/image/foldericon.png")};
Ui::Widget *ui;
QVector<QWidget*> pages;
class QStackedWidget* mainStack;
int m_MainPageIndex=0;
//Window Move Member
class QPoint m_lastPos;
bool isPressedWidget;
enum class ObjectType{
FILE_ENCRYPT,DIR_ENCRYPT,FILE_DECRYPT,DIR_DECRYPT,UNKNOWN
};
struct obj_file_info{
QString name;//=raw_name+appendix
QString raw_name;
QString path;
QString appendix;
obj_file_info()=default;
~obj_file_info()=default;
obj_file_info(const QString& name,const QString& raw_name,const QString& path,const QString&app):name(name),raw_name(raw_name),path(path),appendix(app){}
void update(const QString& name,const QString& path)
{
this->name=name;
this->path=path;
auto tmpList=this->name.split(".");
if(tmpList.size()>2)
{
QStringList resList;
for(int i=0;i<tmpList.size()-1;i++)
resList.append(tmpList[i]);
this->raw_name=resList.join(".");
}
else
this->raw_name=tmpList[0];
this->appendix=tmpList.size()==1?"":tmpList[tmpList.size()-1];
}
};
struct obj_dir_info{
QString name;//=path+raw_name
QString raw_name;
QString path;
obj_dir_info()=default;
~obj_dir_info()=default;
void update(const QString&name,const QString& raw_name,const QString& path)
{this->name=name;this->raw_name=raw_name;this->path=path;}
};
ObjectType m_objType=ObjectType::UNKNOWN;//Mode: File/Dir Encryption/Decryption
obj_file_info m_fileInfo;//Record File Infomation
obj_dir_info m_dirInfo;//Record Directory Infomation
//Record Information of AES
int AES_Length=0;
int AES_Mode=0;
int AES_Padding=0;
//Record important pointers
class std::array<PasswordEditor*,2> passwdArray;
QPointer<QLineEdit> hintInput;
QPointer<QLabel> hintOutput;
QPointer<ProgressButton> runButton;
FileEncryption* m_fileEncryption=nullptr;
QThread* m_thread=nullptr;
//zip helper
class CompreDecompreFileThread *compreDecompreFileThread;
QThread *compreDecompreFileMainThread;
};
#endif // WIDGET_H
fileenccryption.h
#ifndef FILEENCRYPTION_H
#define FILEENCRYPTION_H
#include <QObject>
#include "qaesencryption.h"
class FileEncryption : public QObject
{
Q_OBJECT
public:
explicit FileEncryption(QObject *parent = nullptr);
void setFile(const QString& strIn, const QString& strOut);
void setKey(const QByteArray& key);
void setEncryption(bool flag);
void setAESParameter(QAESEncryption::Aes aes, QAESEncryption::Mode mode, QAESEncryption::Padding padding);
void stop();
void setHintText(const QString& txt);
QString getHintText(const QString& filename);
static std::string base64EncryptStr(const std::string& plainText);
static std::string base64DecryptStr(const std::string& plainText);
static inline bool is_base64(unsigned char c);
static QString base64EncryptStr(const QString& plainText);
static QString base64DecryptStr(const QString& plainText);
signals:
void start();
void showLog(QString log);
void finish(bool hasError);
private:
void startEncryption();
void encryption();
void decrypt();
bool readFile(const QString& fileName);
void dataOperation();
void check();
bool writeFile(const QString& fileName);
void clear();
private:
QString m_strIn;
QString m_strOut;
QString m_fileSuffix;
QByteArray m_key;
QByteArray m_iv;
bool m_encryption = true;
QAESEncryption::Aes m_aes;
QAESEncryption::Mode m_mode;
QAESEncryption::Padding m_padding;
QByteArray m_dataIn;
QByteArray m_dataOut;
QByteArray m_md5;
QByteArray m_head;
};
#endif // FILEENCRYPTION_H
main.cpp
#include "widget.h"
#include <QApplication>
#include <QString>
#include <QDebug>
#include <QResource>
int main(int argc, char *argv[])
{
QResource::registerResource(qApp->applicationDirPath()+"resource/image-qt_5_15-64.rcc");
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
源码下载
软件界面
关于源码构建的一些说明
- 本项目资源文件暂不提供!可以使用“resource”文件夹下的
.rcc
二进制资源文件进行源码构建,该二进制文件使用Qt 5.15 MinGW 64-bit构建。当然,你还可以自己寻找有关图片形成资源文件,并将源码中有关的图片路径替换即可。 - 本项目可能还存在一些潜在Bug未修复,因此强烈建议在加密后,先不删除原文件/文件夹。尝试解密一次并确认该过程无误后,再处理原文件/文件夹。
- 本项目对非英文字符支持还存在一些问题,正在进一步处理中。