我之前已经制作了利用XOR数据加密并完全理解它的程序,但是如何将它实现到程序中以便字符串文字加密?例如,我不想使用:
string name = "My name is Matt";
这会导致“My name is Matt”位于可执行文件中。我猜我必须用单独的程序加密文字,但我真正的问题是如何将加密的字符串存储在可执行文件中(最好不要在单独的文件中)?
同样,我完全理解如何解密字符串及其工作原理,我只需要知道如何在编译结果中传输加密字符串。
感谢您的时间,我真的很感激。
答案 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解码。