2016-11-30 183 views
1

我试图解决在C++中训练的简单任务:异或加密/解密。但我的gamma()函数无法正常工作。它会创建奇怪长度的结果字符串,比原始字符少或超过。我不明白,为什么。我试图将\0添加到结果字符串的末尾,但它不起作用。C++异或加密/解密(异或密码)不适用于我

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。输出

例子:

source: 1234dfdfsd key: avsc234567 source(hex): 31 32 33 34 64 66 64 66 73 64 key(hex): 61 76 73 63 32 33 34 35 36 37 result (hex): 50 44 40 57 56 55 50 53 45 53 4D - length??? try to restore source: 1234dfdfsdM¶ try to restore source in hex: 31 32 33 34 64 66 64 66 73 64 4D 14

+1

不能在空值终止字符串使用XOR,你需要单独保留的长度。 –

+0

你期望看到什么作为输出? – SomeWittyUsername

+0

我试过使用C++字符串,但是我看到一些错误,比如'52 \t 18 test.cpp \t [错误]没有匹配'operator ^'(操作数类型是'std :: string {aka std :: basic_string }'和'std :: string {aka std :: basic_string }')' @SomeWittyUsername 一串字节,可以解释为一串十六进制数字。他们的长度必须匹配原始文本的长度... – WallOfBytes

回答

0

你的函数改为

void gamma(char *s1, char *s2, char *res) 
{ 
    for (int i = 0; i < strlen(s1); i++) { 
     res[i] = s1[i]^s2[i]; 
    } 
    res[strlen(s1)] = '\0'; 
} 
+0

我试过了,但它不起作用。 – WallOfBytes

+1

'xor'的结果可以是'\ 0',所以它仍然存在问题 – Slava

+0

您如何显示结果?显示你的代码。 – Sniper

1

这不是一个好主意,使用二进制数据char*std::string,因为很多地方假定持有零终止的字符串。 (为std::string这是acctually较好,但仍存在一些问题),所以最好使用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; 
} 
+0

是的,我认为,使用字符向量而不是字符串类型是非常好的主意。谢谢! – WallOfBytes