我试图隐藏一些代码,所以当编译后,临时用户如果抓住文件就看不到纯文本字符串。
我发现了这个,它确实做了我想做的事。
string encryptDecrypt(string toEncrypt) {
char key = 'Q';
string output = toEncrypt;
for (int i = 0; i < toEncrypt.size(); i++)
output[i] = toEncrypt[i] ^ key;
return output;
}
它的运行方式如下:
foo[0] = encryptDecrypt("/path/jon/files");
cout << "Encrypted:" << foo[0] << "\n";
string decrypted = encryptDecrypt(foo[0]);
cout << "Decrypted:" << decrypted << "\n";
结果是:
Encrypted:~!0%9~;>?~78=4"
Decrypted:/path/jon/files
我的计划(!)是创建一个新的应用程序,它只生成加密的字符串,然后在我的应用程序中存储数组中的所有加密字符串,然后根据需要解密。
从上面的输出我知道字符串/path/jon/files
被加密到~!0%9~;>?~78=4"
但是如何将其写入数组?
我原以为:
string foo[2];
foo[0] = "~!0%9~;>?~78=4"";
foo[1] = "XXXXXXX";
但是我看不到工作因为字符串包含引号。
有什么办法吗?
当我的初始字符串中包含大写字母时,我似乎遇到了问题。
string encrypted = encryptDecrypt("/Path/Jon/Files");
cout << "Encrypted:" << encrypted << "\n";
string decrypted = encryptDecrypt(encrypted);
cout << "Decrypted:" << decrypted << "\n";
string test = "~0%9~?~8=4\"";
decrypted = encryptDecrypt(test);
cout << "Decrypted:" << decrypted << "\n";
结果:
Encrypted:~0%9~?~8=4"
Decrypted:/Path/Jon/Files
Decrypted:/ath/n/iles
知道怎么解决这个问题吗?
答案 0 :(得分:2)
逃避它
foo[0] = "~!0%9~;>?~78=4\"";
需要谨慎对待,charachter编码和代码页可能会和你开玩笑。
UPD:可能是实际链接base64编码 - 解码How do I base64 encode (decode) in C?和base64 decode snippet in c++
答案 1 :(得分:1)
你失去了&#39;你的首都,因为你用&#39; Q&#39;因此丢失了大部分重要的位,然后它们作为控制代码返回。
这是一个将字符串加密为std::vector<char>
以包含在源代码中的程序。
您计划使用std::string
的问题是某些值可能是无效字符(例如,UTF-8多字节编码的不合适的部分)。
包含无效字符的std::string
的行为未指定。
但是`std :: vector可以包含整个字节值范围。
#include <iostream>
#include <sstream>
#include <vector>
std::vector<char> encrypt(const std::string& toEncrypt) {
char key = 'Q';
std::vector<char> output;
output.reserve(toEncrypt.size());
for (const auto chr : toEncrypt){
output.push_back(chr ^ key);
}
return output;
}
std::string sourcify(const std::vector<char>& toSource,const std::string& comment){
std::stringstream buffer;
buffer<<"const std::vector<char> code={";
bool first=true;
for(const auto chr : toSource){
if(!first){
buffer<<',';
}else{
first=false;
}
buffer<<static_cast<int>(chr);
}
buffer<<"}; /* "<<comment<<" */";
return buffer.str();
}
std::string decrypt(const std::vector<char>& toDecrypt) {
char key = 'Q';
std::string decrypted;
decrypted.reserve(toDecrypt.size());
for(const auto chr:toDecrypt){
decrypted.push_back(chr ^ key);
}
}
int main() {
std::string original="Hello World";
std::vector<char> encrypted=encrypt(original);
std::string sourced=sourcify(encrypted,original);
std::string decrypted=decrypt(encrypted);
std::cout<<original<<std::endl;
std::cout<<sourced<<std::endl;
std::cout<<decrypted<<std::endl;
return 0;
}
答案 2 :(得分:0)
我使用以下方法使我的字符串加密自动化:
https://github.com/PELock/StringEncrypt-WebAPI
现在看起来像这样(我拿了你的字符串,这样你就可以看到结果)
// encrypted with https://www.stringencrypt.com (v1.3.0) [C/C++]
// foo = "/path/jon/files"
wchar_t foo[16];
foo[8] = 0x29F5; foo[15] = 0x591E; foo[14] = 0x10DF; foo[6] = 0x28D7;
foo[2] = 0x538B; foo[12] = 0x5691; foo[7] = 0x2996; foo[1] = 0x240C;
foo[4] = 0x29D9; foo[13] = 0x5890; foo[10] = 0x5553; foo[3] = 0x2B2A;
foo[0] = 0x518D; foo[9] = 0x54F4; foo[5] = 0x57B8; foo[11] = 0x5472;
for (unsigned int vHlTZ = 0, WgRam = 0; vHlTZ < 16; vHlTZ++)
{
WgRam = foo[vHlTZ];
WgRam += vHlTZ;
WgRam ^= 0x4EE7;
WgRam = (((WgRam & 0xFFFF) >> 6) | (WgRam << 10)) & 0xFFFF;
WgRam ^= 0xF4F6;
WgRam += vHlTZ;
WgRam ^= vHlTZ;
WgRam = ~WgRam;
WgRam = ((WgRam << 14) | ( (WgRam & 0xFFFF) >> 2)) & 0xFFFF;
WgRam += vHlTZ;
WgRam = ((WgRam << 4) | ( (WgRam & 0xFFFF) >> 12)) & 0xFFFF;
WgRam -= 0x184C;
WgRam ^= 0xDE4A;
WgRam += 0x5463;
WgRam += vHlTZ;
foo[vHlTZ] = WgRam;
}
wprintf(foo);
它是这样的: