我正在尝试使用long
类型的数字实现简单的XOR加密。不幸的是,一些数字返回了一些符号,这些符号解密后得到的文本与输入的文本完全不同。
例如,使用密钥'hello world'
加密文本'5105105105'
将返回此'��'
。要使用相同的密钥将其解密,它将返回此'>nl wor>nl'
。我不确定为什么要这样做。
这是我的代码:
string encDec(string str, long key) {
string output = str;
for (int i = 0; i < str.size(); i++)
output[i] = str[i] ^ key;
return output;
}
我在这里做错了什么?
让我们看看:output[i] = str[i] ^ key;
这是首先从索引str
的字符串i
中检索一个字符。 std::string
中的字符等效于8位字节。
然后使用隐式加宽转换]将该字节哄骗到long
,以匹配左key
。
之后,所有位都与密钥进行异或运算,执行“加密”。我将其用引号引起来,因为用XOR密码重复使用密钥当然是不安全的。
最后使用隐式缩小转换将这个long值再次分配给char数组。
换句话说,您可以将其视为执行:output[i] = (char) ((long) str[i] ^ key;
,如果您将转换明确化。注意,许多位先被异或,然后在变窄转换期间被丢弃;可能不是您想要的,因为这些关键位基本上被忽略了。
当然,如果您对随机位进行XOR,那么您得到的是随机二进制模式。这种样式可能不包含可打印字符。您要么必须将它们存储或发送为二进制值,要么必须首先将它们转换回可打印的文本。通常,我们使用十六进制或字节的基数64编码来执行此操作。