XOR加密算法无法处理长度超过127个字符的输入
XOR Encryption algorithm unable to handle input greater than 127 chars in length
我的客户端和服务器上有一个相同的加密方法:
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数组中,为通过套接字发送数据做准备。
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 将stl字符串缩小到小于15个字符的容量
- 带有多个字符分隔符的正则表达式
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 如何删除字符串中的前 2 个字符(如果它有"-")
- 注册表正在设置 1 个字符
- 使用类 ?C++ 和 SFML 以及标题中的 15 个字符
- 如何忽略第一个字符输入后的所有内容
- std::stoi 只转换前几个字符
- 仅读取文件末尾的最后 3 个字符,并将其另存为 int
- C++字符数组不接受超过 4 个字符的输入
- 在大小为 10 的 char 数组中输入超过 10 个字符的字符串并输出时,它会显示整个数组而不是前 10 个数组.为什
- 增量生成 - 错误:字符串的第一个字符应'0'或'1'
- 对于多个字符(如 ETX/STX 对),是否有类似于 std::quote 的东西
- 在函数中连接两个字符,并在 C++ 中返回输出
- 如何通过组合多个字符数组来创建字符数组?
- 对c++中的输入使用getline函数时忽略第一个字符
- XOR加密算法无法处理长度超过127个字符的输入
- 字符编码-当读取超过127个ASCII值时,C++cin失败