» Шифровка с помощью пароля. Улучшаем алгоритм шифрования 2 Assembler. Borland Delphi. . Блог программистов


Блог программистов






200815 Фев

Шифровка с помощью пароля. Улучшаем алгоритм шифрования 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 с использованием встроенного ассемблера.

CSCA v1.1 исходники на Assembler и Delphi

Комментарии

  1. 25 февраля, 2008 | 21:31

    Спосибо ценая помощь

  2. 26 февраля, 2008 | 12:43

    Щас попробую зашифрую что нибудь

  3. 29 февраля, 2008 | 17:44

    ну я надеюся на это так как другой язык я не знаю

  4. Romik©
    5 марта, 2008 | 09:49

    Асемблер рулез, хотя я в нём ноль 🙂 Спасибо ещё раз автору за алгоритм реализации на Delphi и вообще за весь алгоритм шифровки-дешфровки :). Использую его в своих программах для шифрования данных своего протокола :). Если в будущем программка успешно будет продаваться, то автора могу отблагодарить веб манями 🙂

  5. 6 марта, 2008 | 09:42

    Да код сначало проверьте ребятки вроде у меня какая то трабла вылазиет

  6. rpy3uH
    6 марта, 2008 | 19:37

    какой код? в чём проблема?
    а лучше всего сходи на форум http://programmersforum.ru/ , и создай тему в соответствующем разделе.

  7. 21 марта, 2008 | 14:29

    Да метод интересный надо попробывать

  8. 12 апреля, 2008 | 00:51

    ага, что-то блог редко обновляется

  9. 17 апреля, 2008 | 04:18

    Vlad, Ален, Статьи будут. Впринципе, есть о чем писать, мотивация вот только хромает, читателей малова-то 🙁

  10. Альтаир
    7 июля, 2008 | 20:01

    В принципе и свое шифрование написать с помощью побитовых операций 🙂

  11. VVkSoft
    9 сентября, 2009 | 22:20

    спасибо искал юнить шифровки.

    бистро пашить на больших файлах