将加密字符串存储在变量中

时间:2016-02-09 14:11:05

标签: c++ encryption

我试图隐藏一些代码,所以当编译后,临时用户如果抓住文件就看不到纯文本字符串。

我发现了这个,它确实做了我想做的事。

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

知道怎么解决这个问题吗?

3 个答案:

答案 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);

它是这样的:

  1. 提供字符串标签
  2. 设置要加密的字符串/文件
  3. 使用随机算法对字符串进行加密
  4. 解密代码是用C / C ++生成的