在基本视图中隐藏字符串(例如记事本)

Hide string from basic viewing (e.g. Notepad)

本文关键字:记事本 字符串 隐藏 视图      更新时间:2023-10-16

我试图在我的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();
}

当您输入一个字符串时,它将被反转为数字。因此"hello"将变成"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",…

这样别人打开你的文件只会看到数字,而不是真正的单词。

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

<标题> Caesar密码h1> 个密码是加密的最基本和最早的版本之一,是的,这实际上是加密,因为你需要一个密钥来加密和解密它。然而,这是一种非常弱的加密形式。

不管怎样,它是这样工作的。你有字母表,你移动它一个特定的时间。因此,
ABCDEFGHIJKLMNOPQRSTUVWXYZ
BCDEFGHIJKLMNOPQRSTUVWXYZA
被移位,一次。

所以,1是你的"秘密"密钥。

#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个字母中的一个。

<标题>注意

但是,请注意这两种方法都很弱,而且不安全。你要做的就是通过混淆来保证安全。这是不明智的。

你可能感兴趣的另一件事是源代码混淆。

将每个字符替换为键盘上它右边的字符。然后"hello"变成了"jr;;p"。(最右边的字符变成最左边的字符,即。'/'变成'z'。)实现decode函数,然后使用常量,即代替

print("Hello worldn");
你需要

static const char* sz_hello_world = decode("Jr;;p ept;fn");
printf(sz_hello_world);

像'n'或' '这样的特殊字符不应该被触摸。

警告:由于decode函数将分配内存,因此您只需要调用每个decode一次,以避免内存泄漏。这就是为什么你需要static const