XOR字符串加密/解密

时间:2010-10-20 00:51:18

标签: c++ encryption

我之前已经制作了利用XOR数据加密并完全理解它的程序,但是如何将它实现到程序中以便字符串文字加密?例如,我不想使用:

string name = "My name is Matt";

这会导致“My name is Matt”位于可执行文件中。我猜我必须用单独的程序加密文字,但我真正的问题是如何将加密的字符串存储在可执行文件中(最好不要在单独的文件中)?

同样,我完全理解如何解密字符串及其工作原理,我只需要知道如何在编译结果中传输加密字符串。

感谢您的时间,我真的很感激。

4 个答案:

答案 0 :(得分:3)

第一步:编写一个加密字符串的程序,然后将其打印为十六进制数字:

#include <iostream>
#include <iomanip>
#include <iostream>

int main(int argc,char* argv[])
{
    std::string const  value = argv[1];
    std::string const  key   = argv[2];

    std::cout << "string " << argv[3] << " (\"";
    for(std::size_t loop = 0; loop < value.size(); ++loop)
    {
        std::cout << "\\x"
                  << std::hex
                  << std::setw(2)
                  << std::setfill('0')
                  << static_cast<unsigned int>(value[loop] ^ key[loop % key.size()]);
    }
    std::cout << "\"," << value.size() << ");\n";
}

步骤2:为每个文字运行应用程序。它应该输出您可以将其传递到您的应用程序中的代码。

> ./a.exe Martin York Cool
string Cool ("\x14\x0e\x00\x1f\x30\x01",6);

注意:由于字符串现在可能包含nul字符,因此无法使用带有C-String的普通字符串构造函数。您需要使用带有char *和长度的构造函数。

答案 1 :(得分:1)

假设你正在剥离符号,你应该能够做出类似的事情:

static const char *kMyNameIsMatt = "arosietnarsoitne";  // Where that mess is the XOR-obfuscated string.
string name = kMyNameIsMatt;
std::cout << XORUnobfuscate(name) << std::endl;

如果您没有剥离符号,那么您也可以使用以下内容对符号进行模糊处理:

#define kMyNameIsMatt ABC123XYZZY

答案 2 :(得分:1)

如果您正在执行按位xor,那么您的“字符串”可能包含大量不可打印的字符,因此您无法通过String str = "[something]"定义它。最好的办法是将它表示为代表每个字符的整数数组。然后让你的字符串回来,只是对各个字符进行异或,然后将它们全部附加在一起形成你未加密的字符串。

答案 3 :(得分:0)

如果您使用的是ascii,请使用十六进制字符表示法......

void formatString(char *buffer, char *input) {
    char *pos = buffer;
    while (*input != '\0') {
        sprintf(pos, "\\x%02x", (int)*input);
        input++;
        pos += 4;
    }
}

void main() {
    char buffer[100]; // 4 chars for every char in the input
    char *original = "ABCD";
    int size = formatString(buffer, original);
}

这应该会为您提供一个结果字符串,例如“\ x41 \ x42 \ x43 \ x44”,您可以将其放入程序中。不幸的是,当你XOR时,一些结果字节可能是null。如果在程序中最终得到“\ x57 \ x00 \ x68 \ xf7”,那么该字符串将仅报告为一个字符,因为null将终止它,因此您需要单独存储字符串的大小。这可以通过Base64编码加密的字符串来处理。否则,如果您只使用ASCII 0-127,则可以在每个字符上设置第7位并以空值结束。如果您的XOR值为0x55,0x42,0x55,0x55,它们将“ABCD”转换为0x14,0x00,0x16,0x11,通过设置第7位,您将得到0x94,0x80,0x96,0x91:

void main() {
    char encryptedString = "\x94\x80\x96\x91";
    char buffer[100];
    decryptString(buffer, encryptedString);
    printf("Original: %s\n", buffer);
}

其中decryptString执行XOR,然后通过使用0x7f和

来删除第7位

虽然有很多免费代码用于Base64,所以我只需要在XOR之后对结果字节进行Base64编码,然后在异或之前对字符串进行Base64解码。