如何将 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;
}
由于我们在这里使用动态内存分配,因此我们需要确保调用者在完成后删除内存,否则将导致内存泄漏。
sizeof() 是一个编译时运算符,用于评估其参数类型的大小。当您执行 sizeof(toEncrypt)
时,您实际上只是在执行 sizeof(char*)
—— 而不是字符串的长度,这正是您想要的。您需要以某种方式指明 toEncrypt
字符串的长度。这里有两个可能的解决方案:
向 encryptDecrypt
添加整数参数,指定 toEncrypt
的字符长度。
如果您知道 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;
}
所以基本上我正在使用的库我不能使用 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;
}
由于我们在这里使用动态内存分配,因此我们需要确保调用者在完成后删除内存,否则将导致内存泄漏。
sizeof() 是一个编译时运算符,用于评估其参数类型的大小。当您执行 sizeof(toEncrypt)
时,您实际上只是在执行 sizeof(char*)
—— 而不是字符串的长度,这正是您想要的。您需要以某种方式指明 toEncrypt
字符串的长度。这里有两个可能的解决方案:
向
encryptDecrypt
添加整数参数,指定toEncrypt
的字符长度。如果您知道
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;
}