C ++中的XOR加密

问题描述 投票:0回答:1

我正在尝试使用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;
}

我在这里做错了什么?

c++ encryption xor
1个回答
0
投票

让我们看看:output[i] = str[i] ^ key;

这是首先从索引str的字符串i中检索一个字符。 std::string中的字符等效于8位字节。

然后使用隐式加宽转换]将该字节哄骗到long,以匹配左key

之后,所有位都与密钥进行异或运算,执行“加密”。我将其用引号引起来,因为用XOR密码重复使用密钥当然是不安全的。

最后使用隐式缩小转换将这个long值再次分配给char数组。

换句话说,您可以将其视为执行:output[i] = (char) ((long) str[i] ^ key;,如果您将转换明确化。注意,许多位先被异或,然后在变窄转换期间被丢弃;可能不是您想要的,因为这些关键位基本上被忽略了。


当然,如果您对随机位进行XOR,那么您得到的是随机二进制模式。这种样式可能不包含可打印字符。您要么必须将它们存储或发送为二进制值,要么必须首先将它们转换回可打印的文本。通常,我们使用十六进制或字节的基数64编码来执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.