C Xor加密(初学者)

时间:2015-02-19 10:15:38

标签: c

我找到了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;

2 个答案:

答案 0 :(得分:4)

1,在encryptDecrypt output中是一个局部变量并链接到一个静态字符串区域,它是只读的。通常,您需要创建一个缓冲区空间并将其传递给encryptDecrypt。函数内的malloc也可以,但您需要手动free。顺便说一下,strlen也很危险,因为加密数据可能不是有效的字符串。

2,使用WCHARwcslen代替CHARstrlen,密钥使用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;
}