我找到了xor加密的此代码,它可以正常工作
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 *(我没有使用字符串的权限)
问题是:
1-第二个代码中的问题是什么?
2-如何将键更改为单词而不是字符?
感谢您的帮助:)
修改
问题是它在第7行
之后立即中断根本不会执行此行:
output[i] = toEncrypt[i] ^ key;
答案 0 :(得分:4)
1,在encryptDecrypt
output
中是一个局部变量并链接到一个静态字符串区域,它是只读的。通常,您需要创建一个缓冲区空间并将其传递给encryptDecrypt
。函数内的malloc
也可以,但您需要手动free
。顺便说一下,strlen
也很危险,因为加密数据可能不是有效的字符串。
2,使用WCHAR
和wcslen
代替CHAR
和strlen
,密钥使用L'k'
应该有效。
答案 1 :(得分:0)
1-第二个代码中的问题是什么?
据我了解,您希望加密和解密c字符串。 C中的字符串通常是字符数组,以0结尾。另外,你在这里使用指针算术错误。
虽然:
string output = toEncrypt;
执行整个字符串的复制操作,
CHAR* output = toEncrypt;
将只创建一个新指针,让它指向指针toEncrypt
指向atm的同一点。所以最后你只有两个指向同一位置的指针,就像使用1指针一样好。
我建议您在该方法中创建一个新缓冲区来存储加密数据:
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()
之类的方法在某处显示此字符串,则可能会在字符串后显示一些内存垃圾,因为加密仅返回非零终止的加密数据< / em>的
2-如何将键更改为单词而不是字符?
你可以使用几种XORing方法和Key-String,但最简单的方法之一就是一遍又一遍地对字符串进行异或。
类似的东西:
kylewbanks.com
XOR keykeykeykeyke
__________________
RESULT
如果您的密钥字符串是&#34;密钥&#34;
可能的解决方案:
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;
}