Пример шифрования данных
Материал из 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