Шифровка с помощью пароля. Улучшаем алгоритм шифрования 2
Логическое продолжение предыдущей статьи «Шифровка с помощью пароля. Улучшаем алгоритм шифрования». В той статье описан довольно-таки эффективный (по-моему) алгоритм шифрования данных с помощью пароля. Но у него был недостаток: если пароль состоит из одинаковых символов, то все модификации пароля сходят на нет (как ни модифицируй, всё равно та же строка)! В этой небольшой статье я расскажу, как этого избежать.
Единственное что приходит в голову это добавление к паролю дополнительных символов, чтобы при модифицировании пароля получалась другая CRC32. Увеличение пароля, одновременно увеличивает защищённость алгоритма, так как количество модификаций увеличивается, а следовательно увеличивается и количество CRC32 с помощью которых шифруются данные.
Итак, мы решили, что надо увеличивать пароль. Но как? Вариант, с добавлением в конец одной и той же последовательности символов не подходит, потому что алгоритм становится предсказуемым. Следовательно, надо добавлять последовательность символов в зависимости от самого пароля. Неплохим будет такой способ: код каждого символа пароля уменьшается на число равное его позиции в пароле, после чего получившаяся строка добавляется к искомому паролю. В результате уменьшения кода символа может получиться значение 0, а это обозначает конец строки, чтобы не было нуля мы заменяем его на код $7F. В результате этого преобразования длина пароля увеличивается в два раза и уже можно быть на 100% уверенным, что в нём будет как минимум 2 разных символа. По моим расчётам, в результате такого преобразования, защищённость алгоритма возрастает как минимум в 4 раза.
Теперь, остаётся только реализовать всё это. Основной код алгоритма не измениться, изменится только начальный код функции шифровки и добавится функция для расширения пароля. Код функции расширения:
ExpandString:
;ESI - pointer to string
pushad
mov ebx, esi
mov edi, esi
call GetZSLength
add edi, eax
mov ecx, eax
rep movsb
mov byte [edi], 0
add ebx, eax
mov ecx, 1
.rep:
sub byte [ebx], cl
cmp byte [ebx], 0
jnz @f
mov byte [ebx], 7Fh
@@:
inc ecx
inc ebx
cmp byte [ebx],0
jz .endrep
jmp .rep
.endrep:
popad
ret
Сначала мы сразу создаём копию пароля сразу за ним, после чего уменьшаем код каждого символа в копии пароля на число равное позиции символа. Как видно, производится беззнаковое уменьшение, т.е., например, уменьшение кода символа 11 на 15 даст нам значение кода 252. Следует отметить, что максимальное уменьшение равно 255, так как уменьшение на больше чем на 255 нецелесообразно. Таким образом, даже если искомая длина пароля больше чем 255, то 256 символ пароля останется неизменным, а 257 символ уменьшится на 1.
Теперь осталось только изменить сам код шифрующей функции. Начальный код функции шифровки теперь будет таким:
proc CSCA1 DataAddress, DataSize, Password
local PasswordCp:DWORD
local PasswordLength:DWORD
pushad
mov edi, [Password]
call GetZSLength
mov ebx, eax
shl eax, 1
mov [PasswordLength], eax
inc eax
stdcall [VirtualAlloc],0,eax, MEM_COMMIT+MEM_RESERVE, PAGE_READWRITE
mov edi, eax ; eax = password offset
mov esi, [Password]
mov ecx, ebx
rep movsb
mov [PasswordCp], eax
mov esi, eax
call ExpandString
xor ecx, ecx
.next: ; ecx
mov esi, [PasswordCp]
mov edi, [PasswordLength]
mov eax, ecx
call NextPasswordMod
…
В предыдущей статье всем не понравилось то, что функцию шифровки я вынес в отдельную DLL. Я аргументирую своё решение тем что этот алгоритм можно будет использовать в программах написанных как на С/С++ так и на Delphi. Наверно это и в правду неудобно…. В архиве с исходниками есть также реализация этого алгоритма на Delphi с использованием встроенного ассемблера.
Спосибо ценая помощь
Щас попробую зашифрую что нибудь
ну я надеюся на это так как другой язык я не знаю
Асемблер рулез, хотя я в нём ноль 🙂 Спасибо ещё раз автору за алгоритм реализации на Delphi и вообще за весь алгоритм шифровки-дешфровки :). Использую его в своих программах для шифрования данных своего протокола :). Если в будущем программка успешно будет продаваться, то автора могу отблагодарить веб манями 🙂
Да код сначало проверьте ребятки вроде у меня какая то трабла вылазиет
какой код? в чём проблема?
а лучше всего сходи на форум http://programmersforum.ru/ , и создай тему в соответствующем разделе.
Да метод интересный надо попробывать
ага, что-то блог редко обновляется
Vlad, Ален, Статьи будут. Впринципе, есть о чем писать, мотивация вот только хромает, читателей малова-то 🙁
В принципе и свое шифрование написать с помощью побитовых операций 🙂
спасибо искал юнить шифровки.
бистро пашить на больших файлах