在基本视图中隐藏字符串(例如记事本)
Hide string from basic viewing (e.g. Notepad)
我试图在我的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