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

How do I convert xor encryption from using std::string to just char or char *?

所以基本上我正在使用的库我不能使用 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。因此,我的问题没有得到回答。在将问题标记为已回答之前,请更仔细地阅读我的问题...

为什么不使用字符串输出 = toEncrypt :

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

这里的问题是

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

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

sizeof() 是一个编译时运算符,用于评估其参数类型的大小。当您执行 sizeof(toEncrypt) 时,您实际上只是在执行 sizeof(char*) —— 而不是字符串的长度,这正是您想要的。您需要以某种方式指明 toEncrypt 字符串的长度。这里有两个可能的解决方案:

  1. encryptDecrypt 添加整数参数,指定 toEncrypt 的字符长度。

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

我推荐选项 1,因为如果您不小心 strlen 可能会引入安全漏洞,还因为它允许在您的字符串参数中使用空字节。

你遇到了什么错误?您可以轻松地使用 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] = '[=10=]';
    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;
}