0) Если возможно, просто не ходите туда. Шифрование чрезвычайно сложно понять правильно и, во-первых, часто является неправильным решением. Используйте другие методы для решения проблем безопасности.
1) Если проблема в ненадежном клиенте, не создавайте решение безопасности, которое требует доверия клиента.
2) Если вы можете использовать готовые детали, сделайте это.
3) Если вы не можете использовать готовые детали и вынуждены использовать криптосистему, не используйте криптосистему, которую вы не совсем понимаете.
4) Если вам приходится использовать криптосистему, которую вы не совсем понимаете, то, по крайней мере, не используйте ее для решения проблем, для которых она не предназначена.
5) Если вам нужно использовать криптосистему для катания по деревьям, то, по крайней мере, не позволяйте предположительно враждебному клиенту выбирать зашифрованное сообщение. Выберите токен самостоятельно. Если токен должен включать в себя информацию от клиента, то каким-то образом его очистите; требуется, чтобы это был только прямой текст ASCII, вставка случайного пробела и т. д.
6) Если вам нужно разрешить клиенту выбирать токен, не шифруйте сам токен. Подпишите криптографически безопасный хеш токена. Атакующему гораздо сложнее выбрать токен, который выдает желаемый хэш.
7) Не используйте ту же пару ключей для шифрования исходящих сообщений, что и для защиты входящих сообщений. Получите пару ключей для каждой логически различной операции, которую вы собираетесь выполнить.
8) Шифрование сообщений в обоих направлениях.
9) Подумайте об использовании механизма отзыва, чтобы, узнав, что Ева нападает на вас, вы, по крайней мере, можете отозвать ее лицензию. (Или вы можете отозвать известную скомпрометированную лицензию и т. Д.)