Qt 中文及字符混合加密,双重加密解密

版权声明:如需转载,请告知博主并声明出处 https://blog.csdn.net/CLinuxF/article/details/81975923

Qt 中文及字符混合加密,双重加密解密

最近有个需求需要加解密,还可能涉及到中文,当时在网上找了很久,都只翻到一篇是用Base64来加密中文的,我采用了下发现中文解密根本不回来,具体原因很多说是编码问题,后来自己研究了一下才解决这个问题,当然只是Base64加密是不行的,所以一般是在base64加密后还需要自定义一层加密更为保险,我使用的方法就是异或加密,可以自己配置钥匙。

如果别人不知道你的加密钥匙是无法正常解密的,当然暴力破解也不是不可以,好了,废话不多数说,请看代码:
首先是base64加密实现:

QByteArray MainWindow::encryption( QByteArray plaintextStr)
{
    QByteArray ciphertext = plaintextStr.toBase64();
    return ciphertext;
}

可以自己重载一个QString的方法,这里不累赘。
然后是base64的解密实现:

QByteArray MainWindow::Deciphering(const QByteArray ciphertext)
{

    QByteArray plaintext = QByteArray::fromBase64(ciphertext);
    return plaintext;
}

最后是异或加解密方法实现(调用的都是用一个方法):

QByteArray MainWindow::getXorEncryptDecrypt(const QByteArray &str, const char &key)
{
    QByteArray bs = str;

    for(int i=0; i<bs.size(); i++){
        bs[i] = bs[i] ^ key;
    }

    return bs;
}

最后看下调用的方式:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QString plainTextStr = "你好!啊發到付ABC";
    QByteArray plainText = plainTextStr.toLocal8Bit();
    QByteArray a= encryption(plainText);
    qInfo()<<"加密 = "<<a;
    QByteArray encry = getXorEncryptDecrypt(a, ',');
    qInfo()<<"加密encry = "<<encry;
    QByteArray  plain = getXorEncryptDecrypt(encry, ',');
    qInfo()<<"解密plain = "<<plain;
    QByteArray b = Deciphering(plain);
    QString str = QString::fromLocal8Bit(b);

    qInfo()<<"解密 = "<<str;
}

下面是打印的调试截图:
这里写图片描述

  • 最后总结下:要转换中文就要用到toLocal8Bit,不能使用toLocal1,这个不支持中文,当然最后也要通过fromLocal8Bit再转换回来。上面的钥匙key也是可以设置成QByteArray类型进行字符串加密,可以填入中文等一系列字符串作为钥匙加密,基本上暴力破解是不可能的,但是上面基于char的key是可以暴力破解的,这个更改还是让需求大的人自行更改吧。

Demo地址:https://download.csdn.net/download/clinuxf/10621539

这里写图片描述

猜你喜欢

转载自blog.csdn.net/CLinuxF/article/details/81975923