我找到了这个用于异或加密的代码

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/

10-11 22:13
查看更多