Очень простой метод - хранить обфусцированные строки методом 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;
Чуть сложнее было бы использовать чип Цезаря или чип Вигенера.
Чтобы получить запутанные строки для использования в исходном коде, вы можете использовать приличный текстовый редактор, такой как мой Текстовый редактор Rejbrand или Wolfram | Alpha .
Обновление
ROT13 очень легко расшифровать, но этого может быть более чем достаточно для вашей ситуации, в зависимости от того, как это выглядит! По крайней мере, будет очень трудно идентифицировать строки в двоичном файле. Это займет некоторое реальное усилие, чтобы получить строки. (В конце концов, обычный пользователь даже не смотрит на двоичные файлы в шестнадцатеричном редакторе / текстовом редакторе!) Шифр Цезаря - это очень простое обобщение шифра ROT13, и его также легко расшифровать. Действительно, есть только 25 разных «паролей». Шифр Vigenère гораздо сложнее, и для его взлома требуются действительно серьезные усилия ( особенно , поскольку вы точно не знаете , где в двоичном виде - строки).
В качестве примера ниже я приведу обфусцированную строку с помощью цихпера Vigenère:
XLC tsrgcdk SJ «vrivem» MW CEI с.о. кли acirivqhfriw CW qsbsir tfmjmgw, RRH biimrk HYI pygk gilhlvc М.Ф. WS, WK Leq РПВС pvgsqc FJ agrvwtvcou mrrsiiwx мы izcfp-HEW cmji, rpxlmixl мл г piqg xigfbzgep zrrkyyuv. Mlrvih, HII QMRVVR QCTMIXW VBTPWWWW ИЛСИКК QCLVGIK KS WSQY ER SOSCHIRR KLEX HYI ILHZVI CBMMVSLAVRX MT XLI SrvXL WJ IRBOEKIVCR. Мистер Химвхстхмсл, аи уквп млйввхмеоки хфс тлквтеп зоймвт мт хли сэйвкв цргкдк.
Конечно, можно было бы расширить шифр, чтобы также обрабатывать цифры и специальные символы, включая пробелы. Это может также быть сделано, чтобы смешать заглавные буквы и маленькие буквы. Тогда было бы ужасно трудно (хотя и возможно) расшифровать. Вероятно, гораздо проще расшифровать, если пароль является известным словом, которое можно найти в словаре. Если это , а не слово, это будет безопаснее.
Текст выше обфусцирован с помощью слова, которое вы можете найти в достаточно большом словаре. Текст ниже обфусцирован с использованием бессмысленной строки в качестве пароля:
Мое мнение о том, что я думаю, что у тебя есть все, что нужно для этого. Io puvyeq, fl cjsx xic vmovdq zappzjvz, vnjnatl frcb vy dtmd vhxkt f to 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
Я призываю вас расшифровать эти три текста. Если кому-то удастся расшифровать последний, я обещаю дать этому человеку 100 шведских крон (100 шведских крон)!
Но, тем не менее, Уоррен П прав: если вам действительно требуется высокий уровень безопасности, который даже эксперты не смогут расшифровать, то вам следует использовать шифрование real .
Update
По просьбе Уоррена П, я использую следующий код для шифрования / дешифрования 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;