gpt4 book ai didi

c++ - C++ 中的 XOR 加密

转载 作者:行者123 更新时间:2023-11-28 01:14:34 26 4
gpt4 key购买 nike

我正在尝试使用 long 类型的数字实现简单的 XOR 加密。不幸的是,一些数字会返回一些符号,解密它们会给出与输入的文本完全不同的文本。

例如,使用 key '5105105105' 加密文本 'hello world' 会返回此 '�����”。要使用相同的 key 解密它,它会返回此 '>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;

它所做的是首先从索引 i 处的字符串 str 中检索一个字符。 std::string 中的一个字符相当于一个 8 位字节。

然后使用隐式扩大转换将此字节哄骗成long以匹配左

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

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

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


当然,如果您与随机位进行异或运算,那么您得到的返回是一个随机二进制模式。这种模式可能不包含可打印字符。您要么必须将它们作为二进制值存储或发送,要么必须先将它们转换回可打印文本。通常我们使用字节的十六进制或 base 64 编码来做到这一点。

现代密码学对比特和字节进行操作。诸如凯撒和维吉尼亚密码之类的经典密码确实对文本进行操作并将文本作为输出。归根结底,XOR 是对位的运算,而不是对文本字符的运算。

关于c++ - C++ 中的 XOR 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59121739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com