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

Материал из DRKB



procedure DoEncode(var Source: string; const Key: string);
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;


Author: Vit
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 03977


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

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

1) Код, сильно зависимый от компилятора. Далеко не всегда регистр EAX будет указывать на ячейку с адресом Source, а регистр EDX - на пароль(Key). Но это мелочь.

2) Единственный байт гаммы (или ксорирующей последовательности), который меняется при шифровании - это длина пароля. Остальные символы пароля НИКАК НЕ ПЕРЕМЕШИВАЮТСЯ в ходе шифрования. Алгоритм шифрования примерно такой:

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/


Author: Shaman
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 03978