Пример шифрования данных

Previous  Top  Next

    
 

 

 

Code:

procedure DoEncode(var Source:String; const Key:string);

{©Drkb v.3(2007): www.drkb.ru,

®Vit (Vitaly Nevzorov) - nevzorov@yahoo.com}

asm

Push ESI

Push EDI

Push EBX

Or EAX,EAX

Jz @Done

Push EAX

Push EDX

Call UniqueString

Pop EDX

Pop EAX

Mov EDI,[EAX]

Or EDI,EDI

Jz @Done

Mov ECX,[EDI-4]

Jecxz @Done

Mov ESI,EDX

Or ESI,ESI

Jz @Done

Mov EDX,[ESI-4]

Dec EDX

Js @Done

Mov EBX,EDX

Mov AH,DL

Cld

@L1:

Test AH,8

Jnz @L3

Xor AH,1

@L3:

Not AH

Ror AH,1

Mov AL,[ESI+EBX]

Xor AL,AH

Xor AL,[EDI]

Stosb

Dec EBX

Jns @L2

Mov EBX,EDX

@L2:

Dec ECX

Jnz @L1

@Done:

Pop EBX

Pop EDI

Pop ESI

end;

 

 

 

Автор ответа:Vit

©Drkb::03977

Взято с Vingrad.ru http://forum.vingrad.ru


 

 

Комментарий от Chingachguk'a:

 

Мне кажется, у этого алгоритма есть два недостатка:

 

1) Код, сильно зависимый от компилятора. Далеко не всегда

регистр EAX будет указывать на ячейку с адресом Source,

а регистр EDX - на пароль(Key). Но это мелочь.

 

2) Единственный байт гаммы(или ксорирующей последовательности),

который меняется при шифровании - это длина пароля. Остальные

символы пароля НИКАК НЕ ПЕРЕМЕШИВАЮТСЯ в ходе шифрования. Алгоритм

шифрования примерно такой:

Code:

Len:=Lengh(Key);

Index:=Lengh(Key)-1;

i:=1;

repeat

Len:=func1(Len);

Source[i]:=(Key[Index] xor Len) xor Source[i];

dec(Index);

if Index:=0 then Index:=Lengh(Key)-1;

until i<Lenght(Source);

 

 

 

 

 

Нетрудно видеть, что основной для тупого подбора является

длина пароля. Пусть она равна 10. Очевидно, что 1-ый,11,21..

символы будут зашифрованы ОДИНАКОВЫМ значением Key[Index],

но разными значениями Len. Казалось бы, Len для 1,11,21...

будет разным, но это ерунда - ведь Len вычисляется однозначно

на ЛЮБОМ шаге через реккурентный закон func1 !

 

И это - фатальный недостаток.

 


Информацию по шифрованию можно найти на

http://www.cryptography.ru/

 

 

©Drkb::03978

Автор ответа: Shaman

Взято с Vingrad.ru http://forum.vingrad.ru