我找到了这个用于异或加密的代码
string encryptDecrypt(string toEncrypt)
{
char key = 'K'; //Any char will work
string output = toEncrypt;
int z = toEncrypt.size();
for (int i = 0; i < z; i++)
{
output[i] = toEncrypt[i] ^ key;
}
return output;
}
int main(int argc, const char * argv[])
{
string encrypted = encryptDecrypt("kylewbanks.com");
string decrypted = encryptDecrypt(encrypted);
return 0;
}
但当我把它改成这个形式时:
CHAR* encryptDecrypt(CHAR* toEncrypt)
{
char key = 'K'; //Any char will work
CHAR* output = toEncrypt;
for (int i = 0; i < strlen(toEncrypt); i++)
{
output[i] = toEncrypt[i] ^ key;
}
return output;
}
int main(int argc, CHAR* argv[])
{
CHAR* encrypted = encryptDecrypt("kylewbanks.com");
CHAR* decrypted = encryptDecrypt(encrypted);
return 0;
}
出现此消息的程序中断:访问冲突写入位置0x001CCC90
我需要使用CHAR*或WCHAR*作为变量(我没有使用string的权限)
问题是:
1-第二个代码中有什么问题?
2-如何将关键字改为单词而不是字符?
谢谢你的帮助:)
编辑:
问题是它在7号线后立即断裂
它根本不做这行:
output[i] = toEncrypt[i] ^ key;
最佳答案
1-第二个代码中有什么问题?
据我所知,你想加密和解密一个c字符串。C中的字符串通常是字符数组,以0结尾。另外,这里使用的指针算法也不对。
当:
string output = toEncrypt;
对整个字符串执行复制操作,
CHAR* output = toEncrypt;
只需创建一个新指针,并让它指向指针
toEncrypt
指向atm的同一点。所以在最后你只有两个指针指向同一个位置,这和使用一个指针一样好。我建议您在该方法中创建一个新的缓冲区来存储加密的数据:
CHAR* output = new CHAR[strlen(toEncrypt)];
但如果不加密以零结尾的字符串,这可能会导致未定义的行为。因为
strlen
将继续计数字符,直到找到0
。因此,我还建议您将要加密的数据长度发送到您的函数:CHAR* encryptDecrypt(CHAR* toEncrypt, int length)
而且只读字符初始化在C中始终是常量。
所以一个可能的解决方案是:
wchar_t* encryptDecrypt(const wchar_t* toEncrypt, int length)
{
wchar_t key = L'K'; //Any char will work
wchar_t* output = new wchar_t[length]; // Make a temporary buffer
for (int i = 0; i < length; i++)
{
output[i] = toEncrypt[i] ^ key; // Encrypt every char of the array to encrypt
}
return output;
}
int main(int argc, CHAR* argv[])
{
// Your Data to encrypt / decrypt
const wchar_t* sourceString = L"kylewbanks.com";
const int sourceStrLen = wcslen(sourceString); // Get the lenght of your data before you encrypt it and can't use wcslen anymore. Alternatively just enter the amount of characters in your string here.
// Encrypt / Decrypt your String
wchar_t* encrypted = encryptDecrypt(sourceString, sourceStrLen);
wchar_t* decrypted = encryptDecrypt(encrypted, sourceStrLen);
// Free the allocated buffers
delete[] encrypted;
delete[] decrypted;
return 0;
}
注意,如果您想使用
printf()
之类的方法在某处显示该字符串,它可能会在字符串之后显示一些内存垃圾,因为加密只返回以非零结尾的加密数据。2-如何将关键字改为单词而不是字符?
可以对键字符串使用几种异或方法,但最简单的方法之一是反复对键字符串的源字符串进行异或。
类似于:
kylewbanks.com
XOR keykeykeykeyke
__________________
RESULT
如果您的密钥字符串是“key”
可能的解决方案:
wchar_t* encryptDecrypt(const wchar_t* toEncrypt, int length)
{
const wchar_t* key = L"KEY"; // A readonly wide String
wchar_t* output = new wchar_t[length]; // Make a temporary buffer
for (int i = 0; i < length; i++)
{
output[i] = toEncrypt[i] ^ key[i % wcslen(key)]; // i % 3 wil be ascending between 0,1,2
}
return output;
}
关于c - C Xor加密(初学者),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28603704/