Qt 轻量级文件加解密软件(QFileCryptor/FileCryptor)

目录

​​​​​​​前言

部分代码展示

源码下载

软件界面

关于源码构建的一些说明

参考项目


前言

使用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();
}

源码下载

Gitee链接 

Github链接

软件界面

 

关于源码构建的一些说明

  1. 本项目资源文件暂不提供!可以使用“resource”文件夹下的.rcc二进制资源文件进行源码构建,该二进制文件使用Qt 5.15 MinGW 64-bit构建。当然,你还可以自己寻找有关图片形成资源文件,并将源码中有关的图片路径替换即可。
  2. 本项目可能还存在一些潜在Bug未修复,因此强烈建议在加密后,先不删除原文件/文件夹。尝试解密一次并确认该过程无误后,再处理原文件/文件夹。
  3. 本项目对非英文字符支持还存在一些问题,正在进一步处理中。

参考项目

部分代码参考-FileSafe项目

界面风格设计参考-主界面设计

部分代码参考-Qt - 实现压缩文件、文件夹和解压缩操作

界面设计参考-局部部件美化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值