Симметричное и асимметричное шифрование

Понимаем два вида шифрования и почему TLS использует их вместе, а не по отдельности.

Симметричное шифрование использует один общий ключ; асимметричное — пару связанных ключей: публичный и приватный.

Симметричное шифрование: один ключ на двоих

Один и тот же ключ и шифрует, и расшифровывает. Быстро и просто. Покажем идею на учебном XOR-шифре (настоящие алгоритмы вроде AES сложнее, но принцип «один ключ» тот же):

def xor_cipher(text_bytes, key):
    return bytes(b ^ key for b in text_bytes)

key = 42
message = 'secret'

encrypted = xor_cipher(message.encode(), key)
print('Сообщение:   ', message)
print('Зашифровано: ', encrypted.hex())

decrypted = xor_cipher(encrypted, key).decode()
print('Расшифровано:', decrypted, '(тем же ключом', key, ')')

Вывод:

Сообщение:    secret
Зашифровано:  594f49584f5e
Расшифровано: secret (тем же ключом 42 )

Проблема симметрии: как передать общий ключ собеседнику по небезопасной сети? Если злоумышленник перехватит ключ — он прочитает всё. Это «проблема распространения ключа».

Асимметричное шифрование: пара ключей

Здесь два связанных ключа: публичный (его можно раздавать всем) и приватный (хранится в секрете). Что зашифровано публичным — расшифровывается только приватным, и наоборот. Это решает проблему передачи ключа: публичный можно слать открыто. Покажем идею на маленьких числах (как в RSA — модульное возведение в степень):

e, d, n = 3, 7, 33   # учебная пара: открытый (e,n), закрытый (d,n)

message = 4
cipher = pow(message, e, n)      # шифруем ОТКРЫТЫМ ключом
plain  = pow(cipher, d, n)       # расшифровываем ЗАКРЫТЫМ ключом

print('Открытый ключ (e, n):', (e, n))
print('Закрытый ключ (d, n):', (d, n))
print('Сообщение:           ', message)
print('Зашифровано открытым: ', cipher)
print('Расшифровано закрытым:', plain)

Вывод:

Открытый ключ (e, n): (3, 33)
Закрытый ключ (d, n): (7, 33)
Сообщение:            4
Зашифровано открытым:  31
Расшифровано закрытым: 4

В настоящем RSA числа гигантские (сотни цифр), и обратное вычисление без приватного ключа практически невозможно. Здесь числа крошечные — только для демонстрации принципа.

Почему TLS использует оба

У каждого подхода свой недостаток: симметрия быстрая, но непонятно, как передать ключ; асимметрия решает передачу ключа, но медленная для больших объёмов. TLS берёт лучшее от обоих — это называют гибридным шифрованием:

  1. Асимметрией в начале безопасно согласуют общий сеансовый ключ (приватный ключ есть только у сервера).
  2. Симметрией с этим общим ключом быстро шифруют весь дальнейший трафик.

Так решается и проблема передачи ключа, и проблема скорости. Асимметрия используется коротко, в начале; основной обмен — быстрой симметрией.

Итог

  • Симметрия — один ключ, быстро, но как его передать?
  • Асимметрия — пара ключей (публичный/приватный), решает передачу, но медленнее.
  • TLS гибридный: асимметрией согласует сеансовый ключ, симметрией шифрует трафик.
  • Что зашифровано публичным ключом — расшифровывается только приватным.
Проверьте себя
1. Чем симметричное шифрование отличается от асимметричного?
AНичем
BСимметричное использует один общий ключ, асимметричное — пару (публичный и приватный)
CСимметричное безопаснее
DАсимметричное работает быстрее
2. Какую главную проблему симметричного шифрования решает асимметричное?
AСкорость
BБезопасную передачу ключа по небезопасной сети
CРазмер данных
DСжатие
3. Почему TLS использует и симметричное, и асимметричное шифрование?
AДля надёжности — два раза шифрует
BАсимметрией безопасно согласуют сеансовый ключ, а быстрой симметрией шифруют весь трафик
CЭто требование закона
DЧтобы запутать злоумышленника
Поддержать проект