我试图在我的 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/