Симметричное и асимметричное шифрование
Понимаем два вида шифрования и почему 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 берёт лучшее от обоих — это называют гибридным шифрованием:
- Асимметрией в начале безопасно согласуют общий сеансовый ключ (приватный ключ есть только у сервера).
- Симметрией с этим общим ключом быстро шифруют весь дальнейший трафик.
Так решается и проблема передачи ключа, и проблема скорости. Асимметрия используется коротко, в начале; основной обмен — быстрой симметрией.
Итог
- Симметрия — один ключ, быстро, но как его передать?
- Асимметрия — пара ключей (публичный/приватный), решает передачу, но медленнее.
- TLS гибридный: асимметрией согласует сеансовый ключ, симметрией шифрует трафик.
- Что зашифровано публичным ключом — расшифровывается только приватным.