我试图解决在 C++ 中进行训练的简单任务:异或加密/解密。但是我的 gamma()
函数不能正常工作。它创建具有奇怪长度的结果字符串,小于或大于原始长度。我不明白,为什么。我试图将 \0
添加到结果字符串的末尾,但它不起作用。
我的 gamma()
函数是
void gamma(char *s1, char *s2, char *res)
{
for (int i = 0; i < strlen(s1); i++) {
res[i] = s1[i] ^ s2[i];
}
我的原始字符串是
char source[255] = "1234", key[255] = "avsc", result[255];
gamma()
用 length=5
创建一个奇怪的字符串。
输出示例:
来源:1234dfdfsd
key :avsc234567
来源(十六进制):31 32 33 34 64 66 64 66 73 64
key (十六进制):61 76 73 63 32 33 34 35 36 37
结果(十六进制):50 44 40 57 56 55 50 53 45 53 4D - 长度???
尝试恢复源:1234dfdfsdM¶
尝试以十六进制恢复源代码:31 32 33 34 64 66 64 66 73 64 4D 14
最佳答案
使用char*
不是一个好主意或 std::string
对于二进制数据,它假定保存零终止字符串的位置一样多。 (对于 std::string
实际上更好,但仍然存在一些问题),所以最好使用 std::vector<unsigned char>
对于二进制数据:
typedef std::vector<uin8_t> data;
data gamma( const std::string &str, const std::string &key )
{
data r( str.length() );
for( size_t i = 0; i < str.length(); ++i )
r[i] = str[i] ^ key[i%key.length()];
return r;
}
关于C++ XOR 加密/解密(异或密码)对我不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40895747/