c++ - 从基本查看中隐藏字符串(例如记事本)

标签 c++

我试图在我的 C++“程序”中隐藏一些字符串,我注意到如果我的“程序”打开(例如:记事本),人们可以查看字符串并编辑值然后保存,然后重新运行包含更改字符串的程序,他们编辑的字符串将取代我的原始文本。

我不是在寻找任何非常高级的东西,因为我只是想阻止人们编辑在记事本中打开“程序”时可以轻松查看的文本,我不是想阻止任何“黑客” ' 通过这样做,只有在我的“程序”中试图编辑文本时才会打滑。

我试过类似的方法:

char hiddentxt[10];
strcat(hiddentxt,"h");
strcat(hiddentxt,"e");
strcat(hiddentxt,"l");
strcat(hiddentxt,"l");
strcat(hiddentxt,"o");

但是,我敢肯定,如您所知,当涉及到巨大的字符串时,这是非常耗时的(注意:显然这不是隐藏字符串的“安全”方法,但请注意,我并没有尝试防止黑客编辑字符串,只有那些并不真正知道他们在做什么的人)

我也研究过使用 XOR,但对我来说这似乎不是一个好的解决方案。

如有任何帮助,我们将不胜感激!

最佳答案

字母数字/字母表中的位置

您可以将字母表中的每个字母转换为分别代表该字母位置的数字。

  • a = 1
  • b = 2
  • ...
  • z = 26

这个程序是一个快速的“工具”来进行这种类型的编码。将其与您的实际项目分开。
另存为: MyStringEncoder.cpp 并编译

#include <iostream>
#include <string>

using namespace std;

string encodeMyString(string s) {
    string encodedString;
    string alphabet = "abcdefghijklmnopqrstuvwxyz";
    for (int i = 0; i < s.length(); i++) {
        char toEncode = s[i];
        for (int j = 0; j < alphabet.length(); j++) {
            if (toEncode == alphabet[j]) {
                encodedString += to_string(j +1);
                encodedString += "_";
            }
        }
    }

    encodedString.erase(encodedString.length() -1, encodedString.length());
    return encodedString;
}

int main() {
    cout << "Give in string to encode: ";

    string stringToEncode;
    cin >> stringToEncode;

    cout << encodeMyString(stringToEncode);
    cin.ignore().get();
}

当您输入字符串时,它会反转为数字。所以“你好”将变成“8_5_12_12_15”。

在你的实际程序中;你必须有这两个功能:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

//Needed in your actual program
char toAlpha(int n) {
     return "abcdefghijklmnopqrstuvwxyz"[n-1];
}
string decodeMyString(string encodedString) {
     stringstream ss(encodedString);
     string part;
     vector<int> partList;

     while (getline(ss, part, '_')) {
          partList.push_back(stoi(part));
     }

    string decodedString;
    for (int i = 0; i < partList.size(); i++) {
        decodedString += toAlpha(partList[i]);
    }

    return decodedString;
}
//----------------------------------

int main() {

     cout << decodeMyString("8_5_12_12_15");
}

通过将编码后的数字字符串放入函数 decodeMyString() 中,它会反转回“hello”,因为字母表中的八个字符是“h”,第五个是“e",...

这样,打开您的文件的人只会看到数字,而实际上看不到文字。

当然,您仍然需要构建对空格和其他特殊字符的支持。但这只是一个简单的例子。

凯撒密码

这个密码是最基本和第一个版本的加密,是的,这实际上是加密,因为你需要一个 key 来加密和解密它。但是,这是一种非常弱的加密形式。

无论如何,它是这样工作的。 你有字母表,你把它移动到特定的时间。 所以,
ABCDEFGHIJKLMNOPQRSTUVWXYZ
BCDEFGHIJKLMNOPQRSTUVWXYZA
移动一次。

因此,1 是您的“ secret ” key 。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

//Function to encrypt
string toCaesar(string s, int key) {
    string alphabet = "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0; i < s.length(); i++) {
        for (int j = 0; j < alphabet.length(); j++) {
            if (s[i] == alphabet[j]) {
                int index = j + key;
                if (index >= 26) index = index - 26;
                s[i] = alphabet[index];
                break;
            }
        }
    }

    return s;
}

//Function to decrypt
string decryptCaesar(string s, int key) {
    string alphabet = "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0; i < s.length(); i++) {
        for (int j = 0; j < alphabet.length(); j++) {
            if (s[i] == alphabet[j]) {
                int index = j - key; //Only difference is the MINUS here
                if (index >= 26) index = index - 26;
                s[i] = alphabet[index];
                break;
            }
        }
    }

    return s;
}

int main() {
    int inputKey;
    string stringToEncrypt;

    cout << "Give your key: ";
    cin >> inputKey;
    cout << "String to encrypt: ";
    cin >> stringToEncrypt;

    cout << toCaesar(stringToEncrypt, inputKey) << endl;
    cout << decryptCaesar("fgh", 5);
}

这很弱,不仅因为它很容易被暴力破解。还因为如果您采用英语中最常见的字母 ('e') 和密码中最常见的字母,那么您已经拥有 26 个字母之一。

注意事项

但是,请注意,这两种方法都很弱且不安全。 您正在尝试做的事情称为通过混淆实现安全性。并且不建议。

您可能感兴趣的另一件事是 source code obfuscation .

关于c++ - 从基本查看中隐藏字符串(例如记事本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38202978/

相关文章:

c++ - 在 QDialog::exec() 期间使用 QThreads 执行 QWidget::grab()

c++ - 使用来自文件和手册的 cin.get 的输入值差异

c++ - 在 OpenCV 2.3.1 中使用 calcOpticalFlowPyrLK 时出错

c++ - 将指针分配给已分配的指针

java/c++ 输出如何工作? cout<< 系统输出打印

c++ - 使用 WinInet 和 WinHTTP 调用服务器

c++ - 如何在 OpenGL 中使用鼠标在相机周围移动?

c++ - cocos2d-x 中的渲染循环

c++ - 如何将信号 valueChanged 从 QLineEdit 连接到 Qt 中的自定义插槽

c++ - "Console::"不编译