Для каждого сообщения, отправляемого с использованием данного общего секретного ключа, требуется уникальный одноразовый номер. Nonce не обязательно должен быть секретным; простой счетчик вполне подойдет; изменение одного бита в одноразовом номере приведет к тому, что зашифрованный текст будет выглядеть совершенно по-другому, даже если одно и то же сообщение будет отправлено дважды.
Что такое общий секрет? Это ключ, рассчитанный из (секретного ключа A, открытого ключа B) или (открытого ключа A, секретного ключа B). A и B выполняют разные вычисления на основе того, что у них есть, но в итоге получают один и тот же общий секрет.
Общие секреты, используемые в crypto_box
, имеют длину 256 бит. Что огромно. Вы можете смело считать, что общие секреты будут уникальными для каждого «разговора».
Итак, (A, B), (A, C) и (C, B) могут безопасно обмениваться сообщениями, используя одни и те же одноразовые номера. Но если A отправляет сообщение B, используя данный одноразовый номер, B не может отправить сообщение A, используя тот же одноразовый номер. Nonces должны быть уникальными для всего, чем обмениваются во время разговора между A и B.
Таким образом, простой счетчик может быть в порядке. Попросите A выбрать четные числа, оставить нечетные числа B, увеличить одноразовый номер на 2 после каждого отправленного сообщения, и все готово.
Но шифр, используемый в конструкции crypto_box
, на самом деле имеет очень большой одноразовый номер. 192 бита.
Это означает, что если вы игнорируете все, что я написал, и просто выбираете случайный одноразовый номер каждый раз, когда отправляете сообщение, вероятность возникновения коллизии настолько мала, что вы можете быть уверены, что на практике этого никогда не произойдет.
Некоторые потоковые шифры, включенные в Sodium (AES128-CTR, ChaCha20, Salsa20), имеют более короткий одноразовый номер и требуют счетчика во избежание коллизий. Вот почему они находятся в «расширенном» разделе документации.
Но с crypto_box
и crypto_secretbox
просто каждый раз выбирайте случайный одноразовый номер (randombytes_buf(nonce, sizeof nonce)
), и вы будете в безопасности.
person
Frank Denis
schedule
10.06.2015