QT对字符串简单加、解密

使用按位异或^进行加、解密:

加、解密都是使用该函数:

void EncryptionStr(QByteArray &data)
{
    static QByteArray key = "MY_KEY";
    for (int i = 0; i < data.size(); i++)
    {
        data[i] = data[i] ^ key[i % key.size()];
    }
}

发现该加密函数无法对中文进行加密,原因是含有中文每个字符在不同编码格式所占字节数不同。所以将该字符串转为宽字节(每个字符占两个字节),处理后在转换utf8(我的项目使用utf8字符编码).

QString EncryptionStr(QString str)
{
    std::wstring wString = str.toStdWString();
    static QByteArray key = "MY_KEY";
    for (int i = 0; i < wString.size(); i++)
    {
        wString[i] = wString[i] ^ key[i % key.size()];
    }
    return QString::fromStdWString(wString).toUtf8();
}

备注:此处加密key中的字符在加密相同的字符时会产生异常,比如用key="MY_KEY" 来加密MY_KEY加密过后的密文是为空的,因为在异或操作的时候,相同的值结果为0,所以加密过后密文是“\0”为字符串的结束符,导致加密异常。

解决方法:就是将key中字符串的值设置为明文中没有的字符,比如¥~等特殊字符。

你可能感兴趣的:(QT,C++)