我试图在我的c ++'程序中隐藏一些字符串,我注意到我的'程序'是否被打开(例如:记事本)人们可以查看字符串并编辑值然后保存,然后重新运行包含已更改字符串的程序及其编辑的字符串将取代我的原始文本。
我不是在寻找任何非常先进的东西,因为我只是试图阻止人们编辑在记事本中打开“程序”时可以轻松查看的文本,我不是想保留任何“黑客” '从这样做,只有滑行尝试编辑我的'程序'中的文本。
我尝试过类似的事情:
char hiddentxt[10];
strcat(hiddentxt,"h");
strcat(hiddentxt,"e");
strcat(hiddentxt,"l");
strcat(hiddentxt,"l");
strcat(hiddentxt,"o");
但是,我确信你可以说这对于大字符串非常耗时(注意:显然这不是一种隐藏字符串的“安全”方法,但请注意,我不是试图让黑客不要编辑字符串,只有那些不知道自己在做什么的人才会
我也考虑过使用XOR
,但在我的情况下,它似乎不是一个好的解决方案。
任何帮助将不胜感激!
答案 0 :(得分:0)
您可以将字母表中的每个字母转换为该字母的位置数字。
这个程序是一种快速的“工具”来做这种类型的编码。将它与您的实际项目分开。
另存为: 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()
,它将被反转回“你好”,因为字母表中的八个字符是“h”,第五个字符是“e”,...
这样打开文件的人只会看到数字,但实际上不是单词。
当然,你仍然需要建立对空格和其他特殊字符的支持。但这只是一个简单的例子。
这个密码是加密的最基本和第一版本之一,是的,这实际上是加密,因为你需要一个密钥来加密和解密它。但是,这是一种非常弱的加密形式。
无论如何,它的工作原理如下。
您有字母表,并将其移动特定时间。
所以,
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个字母中的一个。
但请注意,这两种方法都很薄弱,而且不安全。 您要做的是通过混淆称为安全性。而且是被忽视的。
您可能感兴趣的另一件事是source code obfuscation。
答案 1 :(得分:-1)
将每个字符替换为键盘右侧的字符。然后“你好”变成“jr ;; p”。 (最右边的字符变成最左边的字符,即'/'变为'z'。)实现解码函数,然后使用常量,而不是
print("Hello world\n");
你需要
static const char* sz_hello_world = decode("Jr;;p ept;f\n");
printf(sz_hello_world);
不应触及“\ n”或“'等特殊字符。
警告:由于您的解码功能将分配内存,因此您只需调用一次解码,以避免内存泄漏。这就是你需要static const
的原因。