![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Шифрование строки методом XOR.Необходим оптимизированный алгоритм
bodun © (2009-09-23 19:15:00)Есть следующий способ шифрования XOR:
var
key, text, longkey, result: string;
i: integer;
toto, c: char;
begin
for i := 0 to (length(text) div length(key)) do
longkey := longkey + key;
for i := 1 to length(text) do
begin
toto := chr((ord(text[i]) xor ord(longkey[i]))); // XOR алгоритм
result := result + toto;
end;
end;
Но если приходиться работать с большим объемом данных, longkeyв два раза увеличит объем памяти занимаемой программой.
Какую альтернативу можете предложить?
Sha (2009-09-24 17:37:00) [1]вроде работает
//предупреждение: длина key4 должна быть кратна 4 !!!!!
procedure XorEncode(var s: string; const key4: string);
var
rest, count, ofs: integer;
elem, term: pchar;
label
Done;
begin;
UniqueString(s);
integer(elem):=integer(s);
ofs:=(integer(key4)-integer(s)) shr 2;
count:=Length(key4) shr 2;
term:=elem + Length(s);
if (elem<>term) and (count>0) then begin;
while true do begin;
rest:=count;
repeat;
pInteger(elem)^:=pInteger(elem)^ xor pIntegerArray(elem)[ofs];
inc(elem,4);
if elem>=term then goto Done;
dec(rest);
if rest<=0 then break;
pInteger(elem)^:=pInteger(elem)^ xor pIntegerArray(elem)[ofs];
inc(elem,4);
if elem>=term then goto Done;
dec(rest);
until rest<=0;
dec(ofs, count)
end;
Done:
term^:=#0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
key = #1#2;
key4 = key + key + key + key;
var
s: string;
begin;
s:='defghdefghdefgh';
XorEncode(s, key4);
ShowMessage(s);
XorEncode(s, key4);
ShowMessage(s);
end;
Sha (2009-09-24 13:37:00) [2]Ща тоже запою, напишите скорей, как я хочу :)
Сергей М. (2009-09-24 13:33:00) [3]
> Омлет (24.09.09 13:14) [12]
Length(key) практически не влияет на сквозную производительность алгоритма.
А вот то что под результат у Slym (C) выделяется отдельнаястрока - это довольно существенный неоптимизированныймомент, ибо автора как раз он и волнует (цитата):
> увеличит объем памяти
> Slym © (24.09.09 10:57) [8]
На оч длинных строках - да, есть резон ксорить блоками.
Омлет (2009-09-24 13:14:00) [4]> Slym ©
А у тебя на каждый символ строки вычисляется Length(key)
Slym (2009-09-24 13:00:00) [5][9] и [10]
Вы забыли блоками по integer работать, если уж оптимизацией занялись
CrytoGen (2009-09-24 12:36:00) [6]
procedure xor2(const key: String, var text:string);
var i,p:integer;
l1,l2:integer;
begin
l1 := Length(key);
l2 := Length(text);
while p<Succ(l2) do
begin
for i:= 1 to Min(l1,l2) do
text[p+i]:= chr((ord(text[p+i]) xor ord(key[i)])));
Inc(p,l1);
end;
end;
Сергей М. (2009-09-24 11:22:00) [7]
procedure xor2(const key: String, var text:string);
var i,j:integer;
begin
j := Length(key);
for i:= 0 to Prev(Length(text)) do
text[i]:= chr((ord(text[Succ(i)]) xor ord(key[Succ(i mod j)])));
end;
Slym (2009-09-24 10:57:00) [8]
function xor2(const key,text:string):string;
var i,j:integer;
begin
j:=1;
SetLength(result,Length(text));
for i:= 1 to length(text) do
begin
result[i]:= chr((ord(text[i]) xor ord(key[j]))); // XOR алгоритм
inc(j);
if j>Length(key) then
j:=1;
end;
end;
anonims (2009-09-23 20:48:00) [9]не использовать операции со строками вида
str:=str+s1;
Leonid Troyanovsky (2009-09-23 19:51:00) [10]
> Сергей М. © (23.09.09 19:44) [5]
> По 300.
Каждому !
От 2 до 5.
--
Regards, LVT.
Сергей М. (2009-09-23 19:44:00) [11]
> Leonid Troyanovsky © (23.09.09 19:41) [3]
>
>
По 300.
Каждому !
Стенка (2009-09-23 19:43:00) [12]> longkeyв два раза увеличит объем памяти занимаемой программой.
> Какую альтернативу можете предложить?
Не использовать longkey
Leonid Troyanovsky (2009-09-23 19:41:00) [13]
> Сергей М. © (23.09.09 19:36) [2]
> Ты тендер что ли объявил ?
Ну, и обеспечить заявки залогом ;)
--
Regards, LVT.
Сергей М. (2009-09-23 19:36:00) [14]
> Какую альтернативу можете предложить?
Ты тендер что ли объявил ?
Leonid Troyanovsky (2009-09-23 19:31:00) [15]
> bodun (23.09.09 19:15)
> Какую альтернативу можете предложить?
Работать со стримами?
F.e.:
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/b2fb08daf11406ff
--
Regards, LVT.