Рейтинг:0

Nonces в chacha20poly1305 против chacha20

флаг cn

В настоящее время я работаю над заменой шифрования chacha20 в своем приложении на chacha20poly1305, но у меня возникает несколько вопросов, на которые я не могу найти четких ответов, в основном связанных с Rust. чача20poly1305 ящик:

  • Почему чача20poly1305 crate требуется одноразовый номер для каждого сообщения, но чача20 требуется только один одноразовый номер при инициализации шифра? Почему это не относится к другим библиотекам, таким как Python PyCryptodome?
  • Требует ли алгоритм ChaCha20Poly1305 новый одноразовый номер для каждого сообщения?
  • Я понимал, что алгоритм ChaCha20 имеет внутренний счетчик, который он комбинирует с ключом и одноразовым номером для генерации блоков ключевого потока (один блок на приращение счетчика). Разве это не тот случай, когда он используется в ChaCha20Poly1305?

Наконец, если ChaCha20Poly1305 (или в моем случае XChaCha20Poly1305) действительно нуждается в новом одноразовом номере для каждого сообщения, можно ли использовать 4-байтовый счетчик для каждого сообщения в сочетании с 20-байтовым случайным одноразовым номером для каждого сеанса в качестве одноразового номера для каждого сообщения? ? (ключ получен из пароля и поэтому может повторяться между сеансами, и каким-то образом сохранить универсальный счетчик для всех сеансов невозможно.)

Спасибо!

kelalaka avatar
флаг in
Каждый потоковый шифр должен использовать пару (одноразовый номер, ключ) только один раз. Никто не может нести ответственность за плохой выбор или ваше неправильное прочтение этого.
kelalaka avatar
флаг in
Я боюсь, что этот вопрос больше касается анализа безопасности реализаций Rust.`инициализация шифра?` - это выбор библиотеки. Хорошая библиотека должна без проблем обрабатывать все и предоставлять пользователю возможности с помощью опций. Например, можно сгенерировать случайный IV, если он не указан, или взять его у пользователя и т. д.
Keegan Conlee avatar
флаг cn
@kelalaka Как насчет этого: будет ли правильно сказать, что в шифре ChaCha20Poly1305 внутренний счетчик шифра ChaCha20 сбрасывается для каждого сообщения? Это объясняет необходимость уникального одноразового номера для каждого сообщения, в отличие от простого ChaCha20, который начинает ключевой поток для каждого нового сообщения с того места, где заканчивалось последнее сообщение.
kelalaka avatar
флаг in
Обычно, когда вы инициализируете шифр, это происходит, может быть, вы забыли инициализировать его в ChaCha20?
Keegan Conlee avatar
флаг cn
@kelalaka что он делает? Насколько я понял после того, как наконец нашел дополнительную документацию, так это то, что, по крайней мере, для библиотек, которые я использую, когда вы запускаете шифр ChaCha20, вы даете ключ и одноразовый номер. Объект шифрования будет хранить состояние (внутренний счетчик), увеличивая счетчик по мере необходимости. В то время как, когда вы запускаете шифр ChaCha20Poly1305, вы даете ему только ключ, так как он не имеет другого состояния, кроме этого, перезапуская внутренний счетчик (и поток ключей) для каждого нового сообщения, которое вы хотите зашифровать, и, таким образом, требуя нового вектора инициализации (который новый одноразовый номер с тем же ключом).
SAI Peregrinus avatar
флаг si
Различные API библиотек.И ChaCha20, и ChaCha20-Poly1305 нуждаются в новом одноразовом номере для каждого сообщения, чтобы обеспечить безопасность. Некоторые библиотеки будут генерировать для вас новые одноразовые номера из одного входного одноразового номера, другие — нет. Как правило, крейты, реализующие трейты шифра, имеют более низкий уровень, чем те, которые реализуют трейты aead.
SAI Peregrinus avatar
флаг si
Также ящик chacha20poly1305 позволяет использовать xChaCha20-Poly1305. Это позволяет использовать случайный одноразовый номер, если вы используете полные 192 бита одноразового номера. Таким образом, вам не нужно ничего сохранять между сообщениями. Счетчик сообщений обрабатывается внутри.
Keegan Conlee avatar
флаг cn
@SAIPeregrinus, похоже, не содержит счетчика сообщений, отсюда и этот пост. Он требует, чтобы вы передавали одноразовый номер при каждом вызове `encrypt()`, и не принимает одноразовый номер при инициализации нового объекта `XChaCha20Poly1305`. Если только я не упустил большую часть его API.
Keegan Conlee avatar
флаг cn
Я просмотрел исходный код ящика chacha20poly1305, и он буквально просто инициализирует совершенно новый шифр для каждого вызова encrypt(): https://docs.rs/chacha20poly1305/latest/src/chacha20poly1305/lib.rs .html#271 Я могу только предположить, что это означает, что мне нужно следить за своим счетчиком сообщений.
SAI Peregrinus avatar
флаг si
encrypt() вызывается один раз для каждого сообщения, каждый раз с новым одноразовым номером. Счетчик в ChaCha — это не счетчик сообщений, это внутренний счетчик, который увеличивается на каждые 512 бит сообщения.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.