XOR加密算法无法处理长度超过127个字符的输入

XOR Encryption algorithm unable to handle input greater than 127 chars in length

本文关键字:127个 字符 输入 加密算法 处理 XOR      更新时间:2023-10-16

我的客户端和服务器上有一个相同的加密方法:

QByteArray Server::encrypt(QString input){
    std::string original = input.toStdString();
    std::string encrypted = "";
    std::string key = "key";
    for (unsigned int temp = 0; temp < original.size(); temp++){
        encrypted += original[temp] ^ ((atoi(key.c_str()) + temp) + 2) % 253;
    }
    QByteArray byteArray(encrypted.c_str(), encrypted.length());
    return byteArray;
}

我将一个长度为143个字符的QString传递到函数中。当我将包含加密文本的QByteArray传递给我的解密函数(它只是颠倒这种XOR加密)时,它将正确地解密前126个字符,但字符串的其余部分将被错误地解密。如果我查看加密的字符串,则第126个字符之后的所有字符都是?,而不是我所期望的随机字符。

我不确定是什么原因造成的。QByteArray是一个字节数组,因此一个元素可以具有的最大值被限制为一个字节的大小,但我不确定为什么元素的数量似乎被限制为字节的大小。特别是考虑到QByteArray::size()返回一个整数

当我调试程序并查看QByteArray的内容时,元素0-125是可以的,但其余元素(位置126处的第127个元素)是负数——例如,我看到的不是91 '['作为某个位置的值,而是-79 / 177

我该如何解决这个问题,以便在输入长度大于126的情况下运行此加密?

如果加密算法为一个字节生成值0,则行

encrypted += original[temp] ^ ((atoi(key.c_str()) + temp) + 2) % 253;

不会做任何事情。不仅如此,线

QByteArray byteArray(encrypted.c_str(), encrypted.length());

将最终访问绑定外的内存。

此外,您已经定义了

    std::string key = "key";

然后使用CCD_ 10。这将始终返回0。希望这是疏忽。

我建议:

QByteArray Server::encrypt(QString input){
    std::string original = input.toStdString();
    size_t size = original.size();
    std::vector<unsigned char> encrypted(size);
    std::string key = "key";
    for (unsigned int temp = 0; temp < size; temp++){
        encrypted[temp] = original[temp] ^ ((atoi(key.c_str()) + temp) + 2) % 253;
    }
    QByteArray byteArray(encrypted.data(), size);
    return byteArray;
}

在@R Sahu提供的解决方案的基础上(它也不太奏效,但朝着正确的方向迈出了一步),我成功地解决了这个问题。我写的修改后的加密方法是:

std::vector<unsigned char> encrypt(QString input){
    std::string original = input.toStdString();
    size_t size = original.size();
    std::vector<unsigned char> encrypted(size);
    std::string key = "key"; //integer in the actual implementation
    for (unsigned int temp = 0; temp < original.size(); temp++){
        encrypted[temp] = original[temp] ^ ((atoi(key.c_str()) + temp) + 2) % 253;
    }
    return encrypted;
}

我不处理QByteArrays(在处理无符号值时似乎有问题,尽管事实上它们不应该这样做),而是简单地返回无符号字符向量,并将其保持为这种形式。当我解密时,我使用一个无符号字符矢量而不是QByteArray,并使用此方法返回一个QString,将无符号字符转换为有符号字符以用于显示目的:

std::string reinterpretedString(reinterpret_cast<char*>(unencryptVector.data())); //unsigned --> signed
QString output;
output = QString::fromStdString(reinterpretedString); //output is now decrypted and readable

每当我有一个无符号的char向量,并且我想用它做一些事情时,我就会使用reinterpret_cast<char*>()函数(无符号的charvector对于函数来说还不够常见,无法重载它们的实现),比如将它存储在char数组中,为通过套接字发送数据做准备。