Статья Руководство по шифрованию

BORM

Участник
Статус
offline
Регистрация
28.02.2023
Сообщения
51
Репутация
48

Руководство по шифрованию: Часть I (Шифр Цезаря)​

1721823015906.png

Шифрование является важной частью программного обеспечения, которое мы используем ежедневно. Оно обеспечивает безопасность в приложениях и помогает сохранять конфиденциальность наших коммуникаций. Веб-страницы, которые мы посещаем ежедневно, используют HTTPS-каналы, которые создаются с файлами, использующими строки шифрования с публичными ключами, называемыми сертификатами. Приложения используют алгоритмы шифрования для защиты учетных данных и установления безопасных каналов передачи информации.

Понимание того, как работают механизмы шифрования наших коммуникаций и приложений, пусть даже на базовом уровне, становится все более необходимым в цифровом мире, в котором мы живем.

На сайте elbinario мы много раз говорили о шифровании и механизмах шифрования. Эта серия статей предназначена для продолжения этой темы, но на этот раз пытаясь быть более наглядными, объясняя несколько общих примеров шифрования простым способом и с примерами кода как для шифрования/дешифрования, так и для попытки их взлома.

Для начала давайте рассмотрим шифр Caesar, очень простой шифр сдвига, который, как говорят, использовал Юлий Цезарь для отправки сигналов своим войскам.

Для шифрования сообщения шифр Caesar использует метод сдвига. Представьте, что у нас есть следующая таблица, в которой мы сверху имеем числовой индекс от 0 до 25, а внизу представляем каждую букву алфавита, начиная с буквы A:
Код:
0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z

Мы упомянули, что Caesar — это шифр сдвига, потому что для шифрования нам нужно переместиться с одного индекса на другой в таблице. Для этого нам нужно числовое значение, указывающее количество ячеек, на которое мы должны сдвинуться. Это значение мы будем называть ключом. Например, если мы хотим зашифровать букву H, используя ключ 5, мы перемещаемся с позиции 7 (H) до позиции 12 (M), поэтому можно сказать, что буква M шифрует H.

Теперь представьте, что у нас есть фраза "HOLA ELBINARIO" и ключ 13 (ключ может быть любым числом от 1 до 25). Используя метод, который мы изучили, первое, что мы сделаем, это найдем первую букву нашей фразы в таблице, например букву H, которая находится в колонке 7, и применим к ней ключ. Таким образом, мы ищем букву, соответствующую колонке (7+13) = 20, что дает нам букву U.

Теперь продолжаем с следующей буквой, которая будет O. Ищем в нашей колонке и применяем формулу (позиция колонки + ключ), что дает нам число 27. Но как мы будем шифровать это, если наш массив имеет только до числа 25? С помощью математического трюка, который заключается в вычитании позиции, которую мы имеем, из максимума массива. Таким образом, вычитаем (27-25) = 2 и ищем букву в позиции 2 (это массив, а не колонка 2), поэтому буква, которая шифрует O, это B. Продолжаем до тех пор, пока не получим наш зашифрованный текст, который будет "UBYNARYVO".

Теперь, когда мы знаем, как вручную зашифровать простой текст с помощью Caesar, давайте напишем очень простую программу на Python для этого. Вот полный код, который мы разберем ниже:

Python:
mensaje = "HOLA ELBINARIO"
llave = 13
SIMBOLOS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
traducion = ''

for simbolo in mensaje:
    if simbolo in SIMBOLOS:
        simboloindex = SIMBOLOS.find(simbolo)
        indextranslado = simboloindex + llave
       
        if indextranslado >= len(SIMBOLOS):
            indextranslado -= len(SIMBOLOS)
        elif indextranslado < 0:
            indextranslado += len(SIMBOLOS)
       
        traducion += SIMBOLOS[indextranslado]

print(traducion)

Вывод программы будет следующим:

Код:
UBYNARYVO

Что именно то, что мы сделали вручную с нашей таблицей. Давайте разберем шаг за шагом, что мы делаем в программе:

  1. Создаем несколько переменных, где храним текст, который будем шифровать, символы, которые будем использовать, длину ключа, который будем использовать, и пустую переменную для переведенного вывода.
  2. Создаем цикл for, где ищем каждый символ нашего сообщения, указывая его позицию.
Python:
for simbolo in mensaje:
    if simbolo in SIMBOLOS:
        print(simbolo)
        simbolоindex = SIMBOLOS.find(simbolo)
        print(simboloindex)

Вывод:

Код:
H
O
L
A
E
L
B
I
A
R
I
O
7
14
11
0
4
11
1
8
0
17
8
14

  1. Добавляем значение ключа к начальному положению каждого символа и применяем if для проверки, что длина сообщения не превышает длину символов, и формируем наш зашифрованный текст с каждым новым положением.
Python:
mensaje = "HOLA ELBINARIO"
llave = 13
SIMBOLOS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
traducion = ''

for simbolо in mensaje:
    if simbolо in SIMBOLOS:
        simbolоindex = SIMBOLOS.find(simbolo)
        indextranslado = simbolоindex + llave
       
        if indextranslado >= len(SIMBOLOS):
            indextranslado -= len(SIMBOLOS)
        elif indextranslado < 0:
            indextranslado += len(SIMBOLOS)
       
        traducion += SIMBOLOS[indextranslado]

print(traducion)

Вывод программы:

Код:
UBYNARYVO


Руководство по шифрованию: Часть II (Атаки грубой силы)​

Как мы обсуждали в предыдущей статье, в этой статье мы рассмотрим, как применить программу грубой силы для попытки угадать зашифрованный пароль с помощью шифра Цезаря.

Попробуем расшифровать пароль "RxJcn66025pJq6JPNPNghN" методом грубой силы с помощью Python. Для этого сначала объясним, что такое атаки грубой силы для взлома паролей.

Атаки грубой силы​

Атаки грубой силы заключаются в попытке угадать зашифрованный пароль путем генерации всех возможных паролей в цикле. Если вспомнить предыдущую статью, мы говорили, что ключ важен для того, чтобы узнать, на сколько позиций нужно сместить наши символы, чтобы найти соответствующий символ для шифрования. В атаке грубой силы для этого шифра мы будем генерировать все возможные пароли, проходя через все длины ключей.

Давайте рассмотрим простой код, который, имея зашифрованное сообщение и набор символов, будет генерировать все возможные комбинации шифрования, проходя через все длины ключей:

Python:
mensaje = "RxJcn66025pJq6JPNPNghN"
SIMBOLOS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 !?.'

for llave in range(len(SIMBOLOS)):
    traducion = ''
   
    for simbolo in mensaje:
        if simbolo in SIMBOLOS:
            simboloindex = SIMBOLOS.find(simbolo)
            indextranslado = simboloindex - llave
           
            if indextranslado < 0:
                indextranslado += len(SIMBOLOS)
               
            traducion += SIMBOLOS[indextranslado]
        else:
            traducion += simbolo

    print(f'Clave #{llave}: {traducion}')

Результаты работы программы будут следующими:

Код:
Clave #0: RxJcn66025pJq6JPNPNghN
Clave #1: QwIbm55914oIp5IOMOMfgM
Clave #2: PvHal448z3ñHo4HÑLÑefL
Clave #3: OuGZk337y2nGñ3GMKMdeK
Clave #4: ÑtFYj226x1mFn2FLJLcdJ
Clave #5: MsEXi115wzlEm1EKIKIbcI
Clave #6: LrDWhzz4vykDlzDJHJHabH
Clave #7: KqCVgyy3uxjCkyCIGIGZaG
Clave #8: JpBUfxx2twiBjxBHFHFYZF
Clave #9: IoATeww1svhAiwAGEGEXYE
Clave #10: Hñ.Sdvvzrug.hv.FDFDWXD
Clave #11: Gn?Rcuuyqtf?gu?ECECVWC
Clave #12: Fm!Qbttxpse!ft!DBDBUVB
Clave #13: El Password es CACATUA
Clave #14: Dk0OZrrvñqc0dr0B.B.ST.
Clave #15: Cj9ÑYqqunpb9cq9A?A?RS?
Clave #16: Bi8MXpptmoa8bp8.!.!QR!
Clave #17: Ah7LWooslñZ7ao7? ? PQ ?
Clave #18: .g6KVññrknY6Zñ6!0!0OP0
Clave #19: ?f5JUnnqjmX5Yn5 9 9ÑO9
Clave #20: !e4ITmmpilW4Xm40808MÑ8

Если внимательно рассмотреть ключ #13, мы получим наш пароль: "El Password es CACATUA" ;)

Как работает процесс?​

В предыдущей статье мы рассмотрели, что ключ 13, который мы выбрали, был числом позиций, на которые нужно сместить символы нашей пароля для его шифрования. В этом примере, поскольку мы не знаем длину ключа, мы будем проходить через все возможные ключи, начиная с 0.

Если мы посмотрим на ключ #1 "QwIbm55914oIp5IOMOMfgM", мы увидим, что этот ключ получен путем смещения каждого символа исходного ключа на одну позицию. Таким образом, буква R соответствует букве Q в ключе #1, P в ключе #2 и так далее для всех символов во всех ключах.

Наша программа просто выполняет вычисления по шифрованию символов на каждой позиции ключа, пока не построит читаемый текст на испанском: "El Password es CACATUA".

Как мы видим, шифры на основе сдвига, такие как Caesar и ROT13, не являются надежными и совершенно небезопасны. В следующей статье мы рассмотрим шифры на основе "транспозиции".

Happy Cracking!