版权声明:如需转载,请告知博主并声明出处 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是可以暴力破解的,这个更改还是让需求大的人自行更改吧。