Qt以Base64加密作为基础实现3种加解密方式(包含中文处理)

2020-12-04 15:13:25  阅读 3397 次 评论 0 条

https://shazhenyu.blog.csdn.net/article/details/81975970?depth_1-


加密算法

本文提供三种方式来加密解密,都是用Qt本身提供的类,没用外接库。


普通base64加密解密

Qt已经有了最基本的toBase64加密算法,同时提供fromBase64解密算法。

加密

QByteArray text = src.toLocal8Bit();
QByteArray by = text.toBase64();12

解密

QByteArray text = src.toLocal8Bit();
QByteArray by = text.fromBase64(text);
QString str = QString::fromLocal8Bit(by); // 注意:这里是处理中文用的123

字符大小写加密解密

在普通Base64加解密算法基础上,用大小写加解密算法进行进一步优化。

大小写加解密算法

// 加解密都用此方法

QString toUpperAndLower(QString src)
{    for(int i = 0; i < src.count(); i++) {
        QChar curC = src.at(i);
        if(curC.isUpper()) {
            curC = curC.toLower();
        } else if(curC.isLower()){
            curC = curC.toUpper();
        }
        src[i] = curC;
    }    return src;
}

加密

QByteArray text = src.toLocal8Bit();
QByteArray by = text.toBase64();
QString str = QString(by);
str = toUpperAndLower(str); // 大小写加密

解密

QString str = toUpperAndLower(src); // 大小写解密
QByteArray text = str.toLocal8Bit();
QByteArray by = text.fromBase64(text);
QString str = QString::fromLocal8Bit(by); // 注意:这里是处理中文用的

异或加解密(钥匙加解密)

在普通Base64加解密算法基础上,用异或加解密(钥匙加解密)算法进行进一步优化。

异或加解密(钥匙加解密)算法

// 加解密都用此方法
QString toXOREncryptUncrypt(QString src, const QChar key)
{    for(int i = 0; i < src.count(); i++) {
        src[i] = src.at(i).toLatin1() ^ key.toLatin1();
    }    return src;
}

加密

QByteArray text = src.toLocal8Bit();
QByteArray by = text.toBase64();
QString str = QString(by);
// 异或加密(钥匙加密)--- 注意:(这里的key是可以指定为任意字符的,相应的,解密也要同意字符才行)
str = toXOREncryptUncrypt(str, 'g');

解密

QString str = toXOREncryptUncrypt(ui->lineEdit_j_3->text(), 'g'); //异或解密(钥匙解密)
QByteArray text = str.toLocal8Bit();
QByteArray by = text.fromBase64(text);
QString str = QString::fromLocal8Bit(by); // 注意:这里是处理中文用的

以下我自己写的 QT5.12.9:

jcode.h

#ifndef JCODE_H
#define JCODE_H
#include <QWidget>
class JCode
{
public:
public slots:
    QString toXOR(QString src, const QChar key);
    QString toUp(QString src);
};
#endif // JCODE_H

jcode.cpp

#include "jcode.h"
// 加解密都用此方法
QString JCode::toXOR(QString src, const QChar key)
{
    for(int i = 0; i < src.count(); i++) {
        src[i] = src.at(i).toLatin1() ^ key.toLatin1();
    }    return src;
}
QString JCode::toUp(QString src)
{
    for(int i = 0; i < src.count(); i++) {
        QChar curC = src.at(i);
        if(curC.isUpper()) {
            curC = curC.toLower();
        } else if(curC.isLower()){
            curC = curC.toUpper();
        }
        src[i] = curC;
    }    return src;
}

widget.h 加上

    #include <jcode.h>
    
    ........
    public:
    JCode * j;


加密代码和解密代码:

void Widget::on_cmdEN_clicked()
{
    QString src=ui->lineEdit->text();
    QByteArray text = src.toLocal8Bit();
    QByteArray by = text.toBase64();
    QString str = QString(by);
    j= new JCode;
    str=j->toUp(str);     //先转换大小写
    str = j->toXOR(str, 'f'); // 异或加密(钥匙加密)--- 注意:(这里的key是可以指定为任意字符的,相应的,解密也要同意字符才行)
    ui->lineEdit_2->setText(str);
}

void Widget::on_cmdDE_clicked()
{
    j= new JCode;
    QString str = j->toXOR(ui->lineEdit_2->text(), 'f'); //异或解密(钥匙解密)
    str=j->toUp(str);     //转换大小写
    QByteArray text = str.toLocal8Bit();
    QByteArray by = text.fromBase64(text);
    str = QString::fromLocal8Bit(by); // 注意:这里是处理中文用的
    ui->lineEdit_3->setText(str);
}


本文地址:http://jinesc.net/?id=236
免责声明:本文为原创文章,版权归 jinesc 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?