一个非常简单的方法是存储被ROT13方法混淆的字符串。
procedure ROT13(var Str: string);
const
OrdBigA = Ord('A');
OrdBigZ = Ord('Z');
OrdSmlA = Ord('a');
OrdSmlZ = Ord('z');
var
i, o: integer;
begin
for i := 1 to length(Str) do
begin
o := Ord(Str[i]);
if InRange(o, OrdBigA, OrdBigZ) then
Str[i] := Chr(OrdBigA + (o - OrdBigA + 13) mod 26)
else if InRange(o, OrdSmlA, OrdSmlZ) then
Str[i] := Chr(OrdSmlA + (o - OrdSmlA + 13) mod 26);
end;
end;
function ROT13fun(const Str: string): string;
begin
result := Str;
ROT13(result);
end;
const
ObfuscatedString = 'Guvf vf n frperg zrffntr.';
procedure TForm4.FormCreate(Sender: TObject);
begin
ShowMessage(ROT13fun(ObfuscatedString));
end;
稍微复杂一点的是使用 Caesar Chipher 或 Vigenère Chipher。
要获得要在源代码中使用的混淆字符串,您可以使用像我自己的Rejbrand Text Editor 或Wolfram|Alpha 这样的体面的文本编辑器。
更新
ROT13 很容易破译,但对于您的情况,它可能绰绰有余,具体取决于它的外观!至少在二进制文件中识别字符串会变得非常困难。获得这些字符串需要付出一些真正的努力。 (毕竟,日常用户甚至不会在十六进制编辑器/文本编辑器中查看二进制文件!)凯撒密码是 ROT13 密码的一个非常简单的概括,也很容易破译。事实上,只有 25 个不同的“密码”。 Vigenère 密码要复杂得多,并且需要付出非常认真的努力才能破解(尤其是,因为您不知道字符串在二进制文件中的确切位置)。
作为一个例子,下面我给出了一个使用 Vigenère 密码混淆的字符串:
Xlc tsrgcdk sj ‘vrivem’ mw cei sd kli acirivqhfriw cw qsbsir tfmjmgw, rrh biimrk hyi pygk gilhlvc mf ws, wk leq rpws pvgsqc fj agrvwtvcou mrrsiiwx we izcfp-hew cmji, rpxlmixzgep ml r yuvqg. zigf Mlrvih, hyi qmrvvr qctmixw vbtpmwkw ilsikc qclvgiq ks wsqy er soxirr klex hyi ilhzvi cbmmvslavrx mt xli Srvxl wj irboekivcr。 hymw qstxmsl 先生,ai uwcp mljvwxmeoki xfs tlcqwtep zojmw mt xli seivkw tsrgcdk。
当然可以扩展密码来处理数字和特殊字符,包括空格。它也可以混合大写和小写字母。那么破译将非常困难(尽管可能)。如果密码是已知单词,则可能更容易破译,该单词可以在字典中找到。如果是不是一个词,那就更安全了。
上面的文字是用一个你可以在足够大的字典中找到的词来混淆的。下面的文本使用无意义的字符串作为密码进行了混淆:
Miwzvjfy m vjsy-tombox zguol ap ahqovz d uwk sbze w conz pe biusvth pagh h njsx。 Io puvyeq, fl cjsx xic vmovdq zappzjvz, vnjnatl frcb vy dtmd vhxkt fto babtf davf。 Uuxlhqb,khk aa dbn eumsuzq,auk saed vlpnbuuo ywlemz ue pnyl ttmxv。 Pa ghof, fl cjsx kmbbzk atmd wv sfjtmxcl rtfysk cb yuta md jsy。 Sqf nql njsx ly vs ilusrn o gok uxwupagupaz u.
最后,下面的文本以同样的方式进行了混淆,但是 - 此外 - 所有空格和特殊字符都已从字符串中删除:
cishkclruervutzgnyarkgzjsaqgsrzvmmrzweolpcnvbkxrvdnqrlurhpmhfaxsuoqncxgzqegnqmngaryfbgozpcgrkgzrrybybmouyzbbkoucbnrnsxkmcbywpllxhkoobmzoydrfvrkhpvsavmzocwjflouboymlotjcnqrirgucdrftllladcwtmnkqehjpmnafoobyvkvdaancbzeokdnsotkkawvanjkryculluyaoklpnojfnqrlatypznpalzocjunuxzdbnzntpqulplekxhrshpttjqyculkkjyxhxgxdozruwlbtkyrsuumkgslbyunabbkryfupvnafobhuoyyvqjlzgzpomc P>
我挑战你破译这三个文本。如果有人能成功破译最后一个,我保证给这个人 100 SEK(100 瑞典克朗)!
但是,Warren P 仍然是对的:如果您真的需要高安全性,即使专家也无法破译,那么您应该选择一些 真正 > 加密。
更新
应 Warren P 的要求,我使用以下代码来加密/解密 Vigenère:
const
OrdBigA = Ord('A');
OrdBigZ = Ord('Z');
OrdSmlA = Ord('a');
OrdSmlZ = Ord('z');
function imod(const x: integer; const y: integer): integer;
begin
if x >= 0 then
imod := x - floor(x/y) * y
else
imod := x + ceil(-x/y) * y;
end;
procedure Vigenère(var Str: string; const Key: string);
var
n, i, o: integer;
KeyChrs: TBytes;
begin
n := length(Key);
SetLength(KeyChrs, n);
for i := 1 to n do
if InRange(ord(Key[i]), OrdBigA, OrdBigZ) then
KeyChrs[i - 1] := Ord(Key[i]) - OrdBigA
else
raise Exception.Create('Invalid character in Vigenère key.');
for i := 1 to length(Str) do
begin
o := Ord(Str[i]);
if InRange(o, OrdBigA, OrdBigZ) then
Str[i] := Chr(OrdBigA + imod((o - OrdBigA + KeyChrs[(i-1) mod n]), 26))
else if InRange(o, OrdSmlA, OrdSmlZ) then
Str[i] := Chr(OrdSmlA + imod((o - OrdSmlA + KeyChrs[(i-1) mod n]), 26));
end;
end;
function Vigenèref(const Str: string; const Key: string): string;
begin
result := Str;
Vigenère(result, Key);
end;
procedure VigenèreD(var Str: string; const Key: string);
var
n, i, o: integer;
KeyChrs: TBytes;
begin
n := length(Key);
SetLength(KeyChrs, n);
for i := 1 to n do
if InRange(ord(Key[i]), OrdBigA, OrdBigZ) then
KeyChrs[i - 1] := Ord(Key[i]) - OrdBigA
else
raise Exception.Create('Invalid character in Vigenère key.');
for i := 1 to length(Str) do
begin
o := Ord(Str[i]);
if InRange(o, OrdBigA, OrdBigZ) then
Str[i] := Chr(OrdBigA + imod((o - OrdBigA - KeyChrs[(i-1) mod n]), 26))
else if InRange(o, OrdSmlA, OrdSmlZ) then
Str[i] := Chr(OrdSmlA + imod((o - OrdSmlA - KeyChrs[(i-1) mod n]), 26));
end;
end;
function VigenèreDf(const Str: string; const Key: string): string;
begin
result := Str;
VigenèreD(result, Key);
end;