如何将xor加密从使用std :: string转换为char或char *?

时间:2015-10-06 16:11:32

标签: c++ string char xor

所以基本上使用我正在使用的库我不能使用std :: string,因为它使用了一些有点折旧的C ++版本我需要将这个xor函数从使用std :: string转换为仅使用char或char *。我一直在尝试,但我无法弄清楚我做错了什么,因为我得到了一个错误。这是代码:

string encryptDecrypt(string toEncrypt) {
    char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work
    string output = toEncrypt;

    for (int i = 0; i < toEncrypt.size(); i++)
        output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];

    return output;
}

如果有人能帮助我,那就太好了。我不确定为什么我不能通过简单地将字符串更改为char *来实现。

编辑:

我试过的是:

char * encryptDecrypt(char * toEncrypt) {
    char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work 
    char * output = toEncrypt; 
    for (int i = 0; i < sizeof(toEncrypt); i++) 
        output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))]; 
    return output; 
}

请注意我没有尝试将std :: string转换为char,我根本无法在此函数的任何实例中使用std :: string。因此,我的问题没有得到解答。在标记回答之前,请仔细阅读我的问题......

4 个答案:

答案 0 :(得分:2)

这里的问题是

char * output = toEncrypt; 

这使得output指向toEncrypt,这不是您想要做的。您需要做的是分配一个新的char*,然后将toEncrypt的内容复制到output

char * encryptDecrypt(char * toEncrypt) {
    char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work 
    int string_size = std::strlen(toEncrypt); 
    char * output = new char[string_size + 1]; // add one for the null byte
    std::strcpy(output, toEncrypt); //copy toEncrypt into output
    for (int i = 0; i < string_size; i++) 
        output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))]; 
    return output; 
}

Live Example

由于我们在这里使用动态内存分配,我们需要确保调用者在完成时删除内存,否则会导致内存泄漏。

答案 1 :(得分:2)

sizeof()是一个编译时运算符,用于计算其参数类型的大小。当你执行sizeof(toEncrypt)时,你真的只是做sizeof(char*) - 而不是字符串的长度,这就是你想要的。您需要以某种方式指示toEncrypt字符串的长度。以下是两种可能的解决方案:

  1. encryptDecrypt添加一个整数参数,以字符为单位指定toEncrypt的长度。

  2. 如果您知道toEncrypt永远不会将空字节作为加密/解密的有效字符(不确定您的应用程序),并且可以假设toEncrypt是空终止的,您可以使用strlen函数在运行时确定字符串长度。

  3. 我建议选项1,因为如果您不小心,strlen会引入安全漏洞,并且因为它允许在字符串参数中使用空字节。

答案 2 :(得分:0)

你得到什么错误?你可以轻松地使用char *来做同样的事情,我已经包含了一个验证功能的示例程序。这是在VS2012下建立的。

#include <string>
#include <stdio.h>

std::string encryptDecrypt( std::string toEncrypt)
{
    char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work
    std::string output = toEncrypt;

    for (int i = 0; i < toEncrypt.size(); i++)
        output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];

    return output;
}

void encryptDecrypt( char* toEncrypt )
{
    char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work
    int len = strlen( toEncrypt );

    for (int i = 0; i < len; i++)
        toEncrypt[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];
}

int main( int argc, char* argv[] )
{
    const char* sample = "This is a sample string to process";
    int len = strlen( sample );
    char* p = new char[ len + 1 ];
    p[len] = '\0';
    strcpy( p, sample );

    std::string output = encryptDecrypt( sample );
    encryptDecrypt( p );

    bool match = strcmp(output.c_str(), p) == 0;
    printf( "The two encryption functions %smatch.\n", match ? "" : "do not "   );

    return 0;
}

答案 3 :(得分:-1)

为什么不代替字符串输出= toEncrypt:

char *output = new char[std::strlen(toEncrypt) + 1];
std::strcpy(output, toEncrypt);