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

标签 c++ qt

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

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() 返回一个 int。

当我调试程序并查看 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";

然后您正在使用 atoi(key.c_str())。这将始终返回 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;
}

关于c++ - XOR 加密算法无法处理长度超过 127 个字符的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26305187/

相关文章:

c++ - 将 Keras 模型转换为 TensorFlow protobuf

c++ - 我正在尝试将 3D 模型查看器集成到我的 GUI 中,但还没有找到一个可以让我轻松完成此操作的库。有什么建议么?

c++ - 基于 Qt 的 CD 开膛手的线程构建 block (TBB)?

c++ - 如何使用 QApplication 创建独立的静态库?

c++ - 使用外部SDK工具链文件的VisualStudio上的CMake项目编译错误

c++ - 移动构造函数似乎没有执行

c++ - 如何在 Visual Studio 中调试单行函数?

c++ - QScrollArea::ensureVisible() 和 QScrollArea::setWidget()

c++ - 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

c++ - 在中央列表中注册派生类