我的客户端和服务器上有相同的加密方法:
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/