Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.08;
Скачать: CL | DM;

Вниз

Шифрование строки методом XOR.Необходим оптимизированный алгоритм   Найти похожие ветки 

 
bodun   (2009-09-23 19:15) [0]

Есть следующий способ шифрования 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 в два раза увеличит объем памяти занимаемой программой.
Какую альтернативу можете предложить?


 
Leonid Troyanovsky ©   (2009-09-23 19:31) [1]


> bodun   (23.09.09 19:15)  

> Какую альтернативу можете предложить?

Работать со стримами?
F.e.:
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/b2fb08daf11406ff

--
Regards, LVT.


 
Сергей М. ©   (2009-09-23 19:36) [2]


> Какую альтернативу можете предложить?


Ты тендер что ли объявил ?


 
Leonid Troyanovsky ©   (2009-09-23 19:41) [3]


> Сергей М. ©   (23.09.09 19:36) [2]

> Ты тендер что ли объявил ?

Ну, и обеспечить заявки залогом ;)

--
Regards, LVT.


 
Стенка   (2009-09-23 19:43) [4]

> longkey в два раза увеличит объем памяти занимаемой программой.
> Какую альтернативу можете предложить?

Не использовать longkey


 
Сергей М. ©   (2009-09-23 19:44) [5]


> Leonid Troyanovsky ©   (23.09.09 19:41) [3]
>
>


По 300.
Каждому !


 
Leonid Troyanovsky ©   (2009-09-23 19:51) [6]


> Сергей М. ©   (23.09.09 19:44) [5]

> По 300.
Каждому !

От 2 до 5.

--
Regards, LVT.


 
anonims   (2009-09-23 20:48) [7]

не использовать операции со строками вида
str:=str+s1;


 
Slym ©   (2009-09-24 10:57) [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;


 
Сергей М. ©   (2009-09-24 11:22) [9]

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;


 
CrytoGen   (2009-09-24 12:36) [10]

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;


 
Slym ©   (2009-09-24 13:00) [11]

[9] и [10]
Вы забыли блоками по integer работать, если уж оптимизацией занялись


 
Омлет   (2009-09-24 13:14) [12]

> Slym ©

А у тебя на каждый символ строки вычисляется Length(key)


 
Сергей М. ©   (2009-09-24 13:33) [13]


> Омлет   (24.09.09 13:14) [12]


Length(key) практически не влияет на сквозную производительность алгоритма.

А вот то что под результат у Slym (C) выделяется отдельная строка - это довольно существенный неоптимизированный момент, ибо автора как раз он и волнует (цитата):


> увеличит объем памяти



> Slym ©   (24.09.09 10:57) [8]


На оч длинных строках - да, есть резон ксорить блоками.


 
Sha ©   (2009-09-24 13:37) [14]

Ща тоже запою, напишите скорей, как я хочу :)


 
Sha ©   (2009-09-24 17:37) [15]

вроде работает

//предупреждение: длина 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;



Страницы: 1 вся ветка

Текущий архив: 2011.05.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
15-1295946347
Дмитрий С
2011-01-25 12:05
2011.05.08
Каким образом ограничивается скорость скачки на стороне клиента?


1-1253695891
Игорь
2009-09-23 12:51
2011.05.08
Как правильно передать из DLL?


15-1295420292
12
2011-01-19 09:58
2011.05.08
Ищу. Софтину. Простой и надежный удаленный доступ.


2-1296050681
ZV
2011-01-26 17:04
2011.05.08
Преобразование Byte в Word?


1-1253459740
нубский вопрос :(
2009-09-20 19:15
2011.05.08
Динамически изменяемый хинт в трее