По сути, у вас есть прямая секретность, если все используемые пары ключей являются эфемерными и что закрытые ключи (NaCl называет их «секретными ключами») должным образом уничтожаются после (однократного) использования. В случае NaCl и отправитель, и получатель используют пару ключей (поскольку это в основном соглашение о ключах / ECIES). Пара ключей получателя обычно статична, а пара ключей отправителя — эфемерна.
Если вы используете один статический открытый ключ получателя, у вас нет прямой защиты, потому что получатель может утечь закрытый ключ. К сожалению, это стандартный режим работы для большинства процедур шифрования, включая NaCl/libsodium.
Хитрость, конечно, заключается в том, чтобы заранее установить доверие к открытому ключу получателя, иначе вместо этого вы можете использовать ключ противника. Если вы хотите иметь прямую безопасность, вы можете поделиться и подписать новый открытый ключ после каждого использования и предпочтительно поддерживать пару секретных ключей в течение как можно более короткого времени. Однако теперь вы ближе к разработке безопасности транспорта, чем к шифрованию сообщений на уровне приложений.