взято отсюда: открыть2025/01/12 Для скучных программистов: немного о шифровании на фронтендахНекоторые вещи мне удобно записывать для себя в дневник как в блокнот. Но вдруг кому-то тоже будет интересно? Современные криптографические методы (из легкодоступных в браузерных приложениях) — это эллиптические кривые семейства 25519 и хороший AES с длинными ключами. Обычно по надежности (а иногда и скорости) они уделывают все эти старинные RSA, который используется до сих пор, например, в PGP. А если завтра квантовый компьютер, а мы невыспавшиеся и не одеты?
AES позволяет надежно шифровать данные и расшифровывать обратно симметрично (одним тем же паролем, плюс еще придется к шифрованным данным запомнить пару коротких констант). AES давно уже встроен аппаратно в любой браузер, и доступен для JS-разработчика как метод crypto. Ниже я накидал две простые функции, как его использовать:
=============== cut ===============
[ ТЕКСТ ПОД КАТОМ: Доступен только в оригинальной заметке на сайте ]
=============== /cut ===============
Но с AES всё понятно давно. А что касается математики эллиптических кривых 25519, она пришла на смену старым методам сравнительно недавно и очень хорошо себя показала. Во-первых, она крайне надежна среди всего зоопарка. Во-вторых, очень быстра. В-третьих, компактна и красива. Например, старые ключи RSA занимали текстовые файл на несколько строк, а публичный ключ 25519 всего одну строчку, и этого скромного размера более чем достаточно. Вот например мой:
=============== cut ===============
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF8ZJDFjcdno13Rez/ebX5/i77YJRg3ODXuQbZgbt2nD
[email protected]=============== /cut ===============
Для JS-разработки существует библиотека noble: https://github.com/paulmillr/noble-ed25519 Её можно использовать и в nodejs-проектах и даже на веб-фронтенде — в полной версии (непакованная) она занимает всего 100кб. Для сравнения: библиотечища PGP openpgp.min.js весит более 600кб, и это дико пакованная.
Что умеет библиотека 25519? Вот например:
1. Сгенерировать новый приватный ключ. А к нему — публичный. Приватный вы храните в тайне, публичный показываете всем.
2. Цифровая подпись. Своим приватным ключом вы можете подписать любые данные. Получатель, зная лишь ваш публичный ключ, всегда сможет проверить, что данные подписали именно вы.
3. Асимметричное шифрование данных для конкретного получателя, зная его публичный ключ (чтобы расшифровать эти данные смог лишь человек, обладающий приватной частью этого ключа). Тут интересный принцип. Старый алгоритм RSA позволял просто взять и зашифровать данные чужим публичным ключом. Алгоритмы 25519 работают чуть сложнее — они используют принцип «общего секрета». Это некий «общий» пароль для А и Б, который нигде не хранится, потому что в любой момент его можно вычислить, причем двумя способами: либо зная публичный ключ А и приватный Б, либо, наоборот, приватный А и публичный Б. Хитрая математика все равно вычислит «общий пароль» одинаково. Поэтому как работает шифрование данных для абонента для его публичного ключа? Первым делом генерируется временный ключ. Он позже будет забыт. С его помощью (используя приватную часть ключа и публичный ключ получателя) вычисляется общий пароль. Остаётся этим паролем тупо и симметрично зашифровать данные (при помощи того же мощного AES), а в комплект к шифровке добавить публичную часть временного ключа. Данные отправляются, все временные ключи и пароль отправитель уничтожает. Теперь никто, кроме получателя, не сможет это расшифровать обратно. А он сможет — добавит к публичному ключу свой приватный и легко вычислит, каким был общий пароль, которым шифрованы данные. И столь же симметрично их расшифрует.
4. Возникает интересная проблема: ну хорошо, а как зашифровать таким способом данн... [не уместилось, окончание на сайте]