C ++ XOR加密/解密(xor cipher)对我不起作用

时间:2016-11-30 18:36:41

标签: c++ encryption xor

我试图解决在c ++中训练的简单任务:xor加密/解密。但是我的 var Hash: TIdHMACSHA256 ; HashValue: TBytes; begin SetCurrentDir(ExtractFilePath(ParamStr(0))); Hash := TIdHMACSHA256 .Create; try Hash.Key := TEncoding.ASCII.GetBytes('devaee2'); HashValue := Hash.HashValue(TFile.ReadAllBytes('menu.xml')); // HashValue is an empty array, why? Tag := Length(HashValue); TFile.WriteAllBytes('menu.xml.hash', HashValue); finally FreeAndNil(Hash); end; end; 函数无法正常工作。它创建的结果字符串具有奇怪的长度,比原始的更少或更多。我不明白,为什么。我试图将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

2 个答案:

答案 0 :(得分:1)

对于二进制数据使用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;
}

答案 1 :(得分: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';
}