GPG в недружественной среде

Здравствуйте!
Вопрос: Имеет ли возможность отправитель данных узнать сессионный ключ в самом банальном случае
gpg -e -r someoneelse somedata
с целью уличить получателя gpg сообщения в нечестности, если он "отказывается" расшифровывать ваше сообщение, под предлогом "испорченности сообщения".
Спасибо!

Комментарии
— SATtva (17/12/2010 17:12)   
Если сообщение было зашифровано только для -r someoneelse — нет. Если же оно было зашифровано и ключом отправителя (опция default-recipient-self в gpg.conf), то возможно:

— Александр (17/12/2010 18:16)   
Спасибо,
К сожалению, такой вариант не подходит, так как в данном gpg используется как анонимизатор. Чуть подробнее: хочется придумать процедуру апелляции для системы анонимного опроса мнений, построенной
на стандартных функциях gpg. Нежелательна генерация нового ключа исключительно с целью пересылки единственного сообщения, к тому же это невозможно сделать в batch-mode.
Упрощенно система выглядит следующим образом:
Отправитель берет 2 публичных ключа: key1, key2, составляет сообщение
[[[message]crypted_key2]crypted_key1]signed_user
и отправляет на host1.
host1 аккумулирует, авторизует, расшифровывает и передает набор сообщений от всех пользователей на host2
{[message]crypted_key2}->host2.
host2 расшифровывает и производит подсчет.
Требуется процедура апелляции, на случай если host1 или host2 отказываются расшифровать сообщение.
Ограничения на систему:
Максимальная простота использования для отправителей (*).

Поэтому следующий вопрос:
правильно ли я понимаю, что Symmetric Ciphers, не работают в batch mode?
как написать скрипт который скормит им passphrases, или их нужно обязательно вводить вручную?
(что нежелательно по причине *)
— SATtva (17/12/2010 18:28, исправлен 17/12/2010 18:28)   
Нежелательна генерация нового ключа исключительно с целью пересылки единственного сообщения, к тому же это невозможно сделать в batch-mode.

Вторая половина фразы не соответствует действительности.


правильно ли я понимаю, что Symmetric Ciphers, не работают в batch mode?
как написать скрипт который скормит им passphrases, или их нужно обязательно вводить вручную?

Целых три варианта (помимо ручного ввода):


— Александр (17/12/2010 19:26)   
Огромное спасибо! Типа тупо пропустил при чтении.
Тогда еще один вопрос, состоящий из двух:
1. для некоторого сообщества, регулярно участвующих в опросах, хочется поставить "локальный"
кей-сервер с веб интерфейсом, то есть такой в который авторизованные ключи можно было бы добавлять руками, а возвращать через веб. Другими словами как сделать видимым public-key-ring на host1 через веб? Наверное, есть удобная реализация?
2. Насколько скомпрометирована (идентифицируема) будет личность отправителя если сообщение закриптовано комбинацией опций
gpg -e --default-recipient-self --hidden-recipient key2 message
при условии доступности информации с public-key-ring
— SATtva (17/12/2010 20:26, исправлен 17/12/2010 20:28)   
для некоторого сообщества, регулярно участвующих в опросах, хочется поставить "локальный" кей-сервер с веб интерфейсом, то есть такой в который авторизованные ключи можно было бы добавлять руками, а возвращать через веб. Другими словами как сделать видимым public-key-ring на host1 через веб? Наверное, есть удобная реализация?

Либо полноценный SKS[link1], либо писать собственную веб-морду с бэк-эндом в виде GPG (примерно как сделано на нашем сайте). Вероятно, второй вариант Вам больше подойдёт.


Насколько скомпрометирована (идентифицируема) будет личность отправителя если сообщение закриптовано комбинацией опций
gpg -e --default-recipient-self --hidden-recipient key2 message
при условии доступности информации с public-key-ring

Она будет скомпрометирована полностью, т.к. --default-recipient-self впишет в пакет сообщения его собственный keyID. Вместо --default-recipient-self используйте в данном случае --hidden-encrypt-to senderKeyID.


Вообще в Вашем случае желательно проверять, какие метаданные утекают через поля OpenPGP-пакетов. /Сервисы/PacketDump[link2] Вам в помощь.

— unknown (17/12/2010 21:13)   
Помните как криптографы международной криптологической ассоциации спорили из-за Java[link3] в своей системе анонимного голосования? Лучшие, так сказать, умы в области криптографии долго пытались построить эту систему для своих нужд. А недавно оказалось, что эта система Helios дырява[link4] на уровне протокола. И что они парятся? Может им просто надо gpg посоветовать и будет всё также легко?
— Александр (17/12/2010 23:50)   
По 1му понятно, по второму пункту понял, что он мне не подходит, так как если скомпрометирован user's private key, то скомпрометировано и его сообщение, что не так в случае симметричного криптования.

Незнакомцу, кажется в Вашей реплике сквозит сарказм, но все равно спасибо за ссылки. Если же Вы к тому же потрудились прочитать, что написано по второй, то должны были поразиться необычайной глубине криптографической мысли авторов, которая позволила им обойти ими же идентифицированную проблему дупликатов голосов:
The ballots replayed in this attack can be identified by checking for duplicates, and these ballots can be rejected.
Гость (18/12/2010 00:53)   
Так это просто фикс.
Гость (18/12/2010 00:58)   
Если сообщение было зашифровано только для -r someoneelse — нет.
SATtva, вам не трудно было бы пояснить почему нет? Давайте посмотрим на схематическом уровне как это работает: отправитель генерит случайный пароль для AES (по умолчанию), оным сообщение шифруется, затем сам пароль шифруется публичным ключом адресата. Теперь результат шифротекст, соответствующий как тому паролю, так и сообщению, вместе упаковываются в PGP-формат и отсылаются. И кто ж теперь запретит получателю разгласить тот самый пароль, раз он его сам же и генерит? Если я не ошибаюсь, то он и есть "сессионный ключ", не так ли?
Гость (18/12/2010 01:00)   
s/запретит получателю/запретит отправителю/
— SATtva (18/12/2010 10:38)   
Давайте посмотрим на схематическом уровне как это работает: отправитель генерит случайный пароль для AES (по умолчанию), оным сообщение шифруется, затем сам пароль шифруется публичным ключом адресата.

Генерируется сеансовый ключ, который зашифровывается открытым ключом получателя. Подумайте, каким образом отправитель теперь может восстановить этот сеансовый ключ, не имея доступа к закрытому ключу получателя? Мы же говорим об асимметричном шифровании, это односторонняя функция.
Гость (18/12/2010 22:44)   
Генерируется сеансовый ключ, который зашифровывается открытым ключом получателя. Подумайте, каким образом отправитель теперь может восстановить этот сеансовый ключ, не имея доступа к закрытому ключу получателя?
А восстанавливать и не надо — достаточно вовремя слить. Раз я, отправитель, сам генерирую сеансовый ключ, я его могу куда надо сохранить перед тем как шифровать открытым ключом адресата. Затем этот сеансовый ключ предъявляется кому надо, и он читает PGP-шифрованное сообщение, не имея ключа адресата. Профит?
— SATtva (18/12/2010 22:58)   
Если модифицировать GPG — да. Но, как я понял, задача не допускает такого решения, нужна именно стандартная реализация.
Гость (18/12/2010 23:08)   
Понятно. Я имел в виду, что сам стандарт (как протокол) это делать позволяет, ну а реализация — вопрос вторичный, ибо важен концепт.
Гость (19/12/2010 02:41)   
GPG в недружественной среде

Вопрос: Имеет ли возможность отправитель данных узнать сессионный ключ в самом банальном случае gpg -e -r someoneelse somedata с целью уличить получателя gpg сообщения в нечестности, если он "отказывается" расшифровывать ваше сообщение, под предлогом "испорченности сообщения".

Ну вот никто как бы не мешает этому самому "недружественному отправителю данных" пропатчить свою gpg так, чтобы всегда иметь на руках сессионный ключ. Получатель данных (адресат) при этом ничего даже не заподозрит (стандарт будет полностью соблюдён), пока в момент X отправитель ВНЕЗАПНО не предъявит сессионный ключ.

P.S.: Такой ответ, имхо, уточняет SATtva'овский, если я правильно тут всех понял.
Гость (29/11/2012 08:19)   
Есть несколько вопросов на примерно ту же тему:

  1. Может ли посторонний (тот, кто не адерсат сообщения) сказать, каким ключом подписан текст, зашифрованный как gpg --no-emit-version -es или gpg --no-emit-version -es?
  2. Тот же вопрос, что и в п.1, при условии дополнительной опции --hidden-recipient.
  3. Тот же вопрос, что и в п.2, но при условии нескольких адресатов (часть публичные, а часть — скрытые).
  4. Если адресатов несколько, можно ли сделать так, чтобы подпись на сообщении была видна только некоторым (публичным и/или скрытым) из них? Если да, то как?
  5. В man gpg говорится
    This option helps to hide the receiver of the message and is a limited countermeasure against traffic analysis.
    Какие подводные камни скрыты за словами "limited countermeasure"?

В faq[link5] написано, что есть следующие три опции для целей неразглашения:

--throw-keyids

--no-throw-keyids

Do not put the recipient key IDs into encrypted messages. This helps to hide the receivers of the message and is a limited countermeasure against traffic analysis. ([Using a little social engineering anyone who is able to decrypt the message can check whether one of the other recip‐ ients is the one he suspects.]) On the receiving side, it may slow down the decryption process because all available secret keys must be tried. --no-throw-keyids disables this option. This option is essentially the same as using --hidden-recipient for all recipients.

--hidden-recipient name

-R

Encrypt for user ID name, but hide the key ID of this user's key. This option helps to hide the receiver of the message and is a limited countermeasure against traffic analysis. If this option or --recipient is not specified, GnuPG asks for the user ID unless --default-recipient is given.

--hidden-encrypt-to name

Same as --hidden-recipient but this one is intended for use in the options file and may be used with your own user-id as a hidden "encrypt-to-self". These keys are only used when there are other recipients given either by use of --recipient or by the asked user id. No trust checking is performed for these user ids and even disabled keys can be used.

Отличия и тонкости этих опций мне не совсем понятны. Оговорка
Using a little social engineering anyone who is able to decrypt the message can check whether one of the other recipients is the one he suspects.
поидее должна относиться ко всем трём опциям, но написана только в одной, как пояснение к "limited countermeasure". Стоит ли что-то ещё за словами "limited countermeasure", какие-то криптографические уязвимости? Как я понял из цитаты[link6]
The --hidden-recipient (or -R) command encrypts to a user, but hides the identity of that user. This is the same functionality as --throw-keyid, but can be used on a per-user basis.
--throw-keyid идентично указанию hidden-recipient для всех, никаких других отличий нет.

Описание разницы между опциями --hidden-recipient и --hidden-encrypt-to ещё более туманно. Что они хотели сказать в
intended for use in the options file?
Ну не настолько же они глупы, чтобы вводить новое имя для одной и той же опции, только чтобы прописать её в gpg.conf, тем более, что вроде как все(?) именования опций идентичны вне зависимости от того, где используются (в командной строке или как опция в gpg.conf).

may be used with your own user-id as a hidden "encrypt-to-self".
А чем была плоха опция --hidden-recipient для тех же целей? Её же тоже можно применить для своего собственного ключа(?).

These keys are ... these user ids
К чему относится эти "these" в обоих предложениях? К значениям опции --hidden-encrypt-to?

These keys are only used when there are other recipients given
Хотят сказать что-то типа "если мы хотим все свои шифруемые сообщения ещё и параллельно скрыто шифровать для какого-то user id, то есть опция под это дело, её можно статически прописать в gpg.conf". И чем на эту роль не угодила --hidden-recipient? Её нельзя прописать в gpg.conf из-за костыльности архитектуры опций gpg? Или ключевое отличие — всё же
No trust checking is performed for these user ids and even disabled keys can be used?
Что они хотели этой цитатой сказать? В чём подразумеваемая связь умолчального скрытого получателя всех сообщений с тем, что почему-то этот получатель может оказаться с disabled key и прочее? Насчёт "trust checking" тоже не понимаю, что имелось в виду. То, что ключ подписан как доверенный с каким-то уровнем в смысле --ask-cert-level?

Кстати, почему-то собственный ключ не является по умолчанию помеченным, как доверенный с cert-level=3. Gnupg же видит, что есть секретный ключ для заданного, но при проверке подписи всё равно ругается на недоверенность. Так сделано на случай расшаривания секретного ключа между группой людей что ли?
Гость (29/11/2012 08:31)   
https://www.pgpru.com/Форум/РаботаСGnuPG/GPGВНедружественнойСреде

GPG в недружественной среде

А в последних комментариях этот топик числится под заголовком "(08:19) Вопрос о сессионном ключе". Почему названия не совпадают?
— SATtva (29/11/2012 08:47, исправлен 29/11/2012 08:48)   
Может ли посторонний (тот, кто не адерсат сообщения) сказать, каким ключом подписан текст, зашифрованный как gpg --no-emit-version -es или gpg --no-emit-version -es?

Если сообщение зашифровано только ключом адресата (т.е. без Вашего), то не может — подпись находится внутри шифртекста. К слову, --no-emit-version — нерелевантная опция, непонятно, зачем Вы её привели.


Тот же вопрос, что и в п.1, при условии дополнительной опции --hidden-recipient.
Тот же вопрос, что и в п.2, но при условии нескольких адресатов (часть публичные, а часть — скрытые).

Аналогично.


Если адресатов несколько, можно ли сделать так, чтобы подпись на сообщении была видна только некоторым (публичным и/или скрытым) из них? Если да, то как?

Отправить разным группам адресатов разные сообщения: одно с подписью, другое — без.


Какие подводные камни скрыты за словами "limited countermeasure"?

Отслеживание самого сообщения, например, плюс то, что приводится в описании опции в квадратных скобках. Смысл в том, чтобы пользователь не полагался на эту опцию как на полноценное средство защиты от анализа трафика.


Отличия и тонкости этих опций мне не совсем понятны.

--throw-keyids применяется ко всем ключам получателей (не уверен, однако, как она сочетается с --encrypt-to-self), --hidden-recipient — только к указанным ключам, --hidden-encrypt-to — только к ключу отправителя (главный нюанс тут в том, что gpg не проверяет уровень достоверности данного ключа). Сам функционал опций обеспечивается идентично, так что и оговорка в квадратных скобках применима к каждой.


Кстати, почему-то собственный ключ не является по умолчанию помеченным, как доверенный с cert-level=3. Gnupg же видит, что есть секретный ключ для заданного, но при проверке подписи всё равно ругается на недоверенность. Так сделано на случай расшаривания секретного ключа между группой людей что ли?

GnuPG автоматически даёт локально генерируемым ключам уровень доверия "ultimate". Собственный ключ может не иметь установленного уровня доверия, только если был импортирован с другой системы (или если по каким-то причинам был утрачен trustdb.gpg). Наличие или отсутствие закрытого ключа в данном случае роли не играет.

Гость (29/11/2012 10:03)   
Спасибо за ответ.

Отслеживание самого сообщения

В смысле анонимности его передачи по интернету? Есть же Tor.

Собственный ключ может не иметь установленного уровня доверия, только если был импортирован с другой системы

Раз доверие строится на подписях, а они импортируются, то в чём отличие импортированного приватного ключа от сгенерённого?

Если добавить строку throw-keyids в gpg.conf, то опция будет применяться по умолчанию ко всем шифровальным операциям, так? Как оно подружится с PGP в jabber? Джабберовское PGP вряд ли будет переопределять умолчания при шифровании, потому вопрос только в том, как сторона получателя отреагирует. Вроде бы есть какие-то тонкости/отличия при работе работе с PGP в разных jabber-клиентах.
— SATtva (29/11/2012 10:25)   
В смысле анонимности его передачи по интернету? Есть же Tor.

Это забота пользователя.

Раз доверие строится на подписях, а они импортируются, то в чём отличие импортированного приватного ключа от сгенерённого?

Достоверность распространяется через подписи. Доверие — свойство ключа, которое gpg хранит в файле trustdb.

Если добавить строку throw-keyids в gpg.conf, то опция будет применяться по умолчанию ко всем шифровальным операциям, так?

По логике, да.

Как оно подружится с PGP в jabber?

Отбрасывание keyid не входит в стандарт OpenPGP, так что джаббер-клиенты могут как послать пользователя с такими выкрутасами, так и нормально работать. Проверяйте. Не забывайте, что джаббер-сессия подписывается прозрачным образом.
— unknown (29/11/2012 14:19)   
Отслеживание самого сообщения

В смысле анонимности его передачи по интернету? Есть же Tor.


Предположим, оба адресата посылают сообщения через Tor, но пользуются даже не общим почтовым сервисом (наподобие гуглопочты), а общим файлообменником для выкладывания шифрованных файлов.

При сокрытии ID-ключа владелец файлообменника не должен определить — это несколько раз обменивались файлами два одинаковых анонима (т.е. фактически псевдонимы) или каждый раз были разные анонимы.

Можно придумать и какой-нибудь другой сценарий, где отличие будет важным.
Гость (01/12/2012 21:30)   
Достоверность распространяется через подписи. Доверие — свойство ключа, которое gpg хранит в файле trustdb.
Я не уверен, что понял вас правильно. Могли бы вы пояснить отличие между достоверностью и доверенностью? Достоверность — уверенность в том, что ключом с некоторым user id действительно владеет персона, указанная в user id (ФИО, ящик и т.п.), а что такое тогда доверие?

При сокрытии ID-ключа владелец файлообменника не должен определить — это несколько раз обменивались файлами два одинаковых анонима (т.е. фактически псевдонимы) или каждый раз были разные анонимы.
throw-keyids защищает анонимов от владельца файлообменника? Не понял, к чему именно был приведён этот пример. Может быть, это пример, когда необходимо
расшаривание секретного ключа между группой людей?
— sentaus (01/12/2012 21:39, исправлен 02/12/2012 12:44)   
Достоверность — уверенность в том, что ключом с некоторым user id действительно владеет персона, указанная в user id (ФИО, ящик и т.п.), а что такое тогда доверие?

Доверие – уверенность в том, что ключи, подписанные данной персоной, являются достоверными. Почитайте /biblioteka/osnovy/setjdoverija[link7], там это расписано.


throw-keyids защищает анонимов от владельца файлообменника?

Да. Если пакет был зашифрован с этим параметром, то в него не будут добавлены идентификаторы открытых ключей, которые использовались для шифрования. Как следствие, сторонний наблюдатель не сможет установить, какими ключами можно осуществить расшифровку.
Минус тут только один – при расшифровке надо пытаться расшифровывать каждым своим закрытым ключом каждую копию сеансового ключа из пакета, но gpg это делает абсолютно прозрачно.

Гость (01/12/2012 22:32)   
Достоверность — уверенность в том, что ключом с некоторым user id действительно владеет персона, указанная в user id (ФИО, ящик и т.п.), а что такое тогда доверие?
Доверие – уверенность в том, что ключи, подписанные данной персоной, являются достоверными. Почитайте https://www.pgpru.com/biblioteka/osnovy/setjdoverija, там это расписано.
Читал давно, перечитал сейчас. Вопрос остаётся. Я прекрасно знаю, что такое сеть доверия и прочее. Ответьте мне конкретно и чётко: что есть доверие и что есть достоверность. И в чём ключевое отличие.
Гость (01/12/2012 22:36)   
Иначе всё, что написано выше, смотрится тавтологией.

Я различаю 2 вещи:
  1. Я сам подписал для себя чей-то ключ с каким-то уровнем сертификации (--ask-cert-level) от 0 до 3ёх и никому об этом не сообщил. Подпись нужна только для меня лично, когда я работаю со своей связкой ключей.
  2. Я доверяю импортированному ключу на основе того, что он подписан с какими-то уровнем сертификации теми дургими ключами, которым я в какой-то мере доверяю (сеть доверия).

Где здесь доверие и где здесь достоверность?
— sentaus (01/12/2012 22:41, исправлен 01/12/2012 22:42)   

Ваше определение достоверности(validity) вполне вменяемо:

Достоверность — уверенность в том, что ключом с некоторым user id действительно владеет персона, указанная в user id (ФИО, ящик и т.п.)

Достоверность – это свойство ключа.


Доверие(trust) – уверенность в том, что ключи, подписанные данной персоной, являются достоверными. Это характеристика личности, владеющей соответствующим ключом, с ВАШЕЙ точки зрения.
Например:
1)У меня есть достоверный ключ Васи. Я доверяю Васе, следовательно все ключи, которые подпишет Вася, будут для меня достоверными автоматически.


2)У меня есть достоверный ключ Пети. Но я не доверяю Пете, я знаю, что он подписывает все подряд ключи, и выставляю ему untrusted, и поэтому его подписи на ключах третьих лиц не будут делать эти ключи достоверными.

— sentaus (01/12/2012 22:47, исправлен 01/12/2012 22:48)   
1. Я сам подписал для себя чей-то ключ с каким-то уровнем сертификации (ask-cert-level) от 0 до 3ёх и никому об этом не сообщил. Подпись нужна только для меня лично, когда я работаю со своей связкой ключей.

Тут есть только достоверность. Предполагается, что вы ключ проверили и считаете его достоверным.


Я доверяю импортированному ключу на основе того, что он подписан с какими-то уровнем сертификации теми дургими ключами, которым я в какой-то мере доверяю (сеть доверия).

В терминах доверия и достоверности лучше сформулировать так: вы считаете импортированный ключ достоверным на основе того, что он подписан ключом, владельцу которого вы доверяете.

Гость (01/12/2012 23:34)   
Доверие(trust) – уверенность в том, что ключи, подписанные данной персоной, являются достоверными.

Вот ключевая фраза. Спасибо, теперь понятно. Получается, доверие к некоторому ключу — это степень трансляционности достоверности этого ключа на достоверность других ключей, им подписанных (при использовании сети доверия).

Возвращаясь к вопросу
Собственный ключ может не иметь установленного уровня доверия, только если был импортирован с другой системы (или если по каким-то причинам был утрачен trustdb.gpg). Наличие или отсутствие закрытого ключа в данном случае роли не играет.
меня всё же удивляет, при чём здесь доверие, если я никогда не участвовал в сети доверия. Имеется в виду, что какая-то умолчальная сеть доверия функционально есть всегда и участие в ней включено по умолчанию?

Наверное, там как-то так: если собственный ключ (к которому имеется и закрытый) не помечен, как доверенный, то его подпись на его же открытом ключе не расценивается, как влекущая за собой достоверность этого (открытого) ключа. Какая-то метаморфоза сознания прям. Даже не могу понять: логично такое поведение или алогично, что из этого следует, и зачем так сделали.

И как мне сделать собственный ключ доверенным, если он был импортирован c другой системы?
— sentaus (02/12/2012 00:07, исправлен 02/12/2012 00:21)   
Получается, доверие к некоторому ключу — это степень трансляционности достоверности этого ключа на достоверность других ключей, им подписанных (при использовании сети доверия).

И как мне сделать собственный ключ доверенным, если он был импортирован c другой системы?

Да всё так. Своему собственному ключу нужно выставить ultimate доверие – он при этом автоматически станет достоверным, и всё, что им подписано, признаётся достоверным. ultimate можно выставить и на открытый ключ без закрытого, только смысла это особого не имеет, если только этот открытый ключ не ваш (а закрытого вдруг по каким-то причинам нет). В общем, его нужно ставить только на свои ключи. :)


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

Нет, от наличия/отсутствия закрытого ключа ничего не зависит, только от выставленного ultimate доверия. Всё это позволяет вычислять достоверности ключей без доступа к закрытым ключам. Например, связка с закрытыми ключами может вообще лежать на не подключеной в данный момент флешке, а рассчитать достоверность ключа адресата всё равно можно.

Гость (02/12/2012 02:03)   
Нет, от наличия/отсутствия закрытого ключа ничего не зависит, только от выставленного ultimate доверия.

Вот как раз это и вызывает вопрос (почему так сделали?). Раз закрытый ключ уже есть на связке, то почему бы не привязаться к этому факту и не сделать его доверенным автоматически? Ну, наверно, есть какие-то use-cases, когда такая привязка внесёт только неразбериху (например, один и тот же закрытый ключ есть у многих участников).

Своему собственному ключу нужно выставить ultimate доверие – он при этом автоматически станет достоверным, и всё, что им подписано, признаётся достоверным

Спасибо, так и сделал. gpg --edit-key 0xXXXXXXXX, uid 1, trust u, 5, save. Надеюсь, всё правильно.
— SATtva (02/12/2012 12:48)   
Вот как раз это и вызывает вопрос (почему так сделали?).

sentaus только что ведь исчерпывающе ответил:
Всё это позволяет вычислять достоверности ключей без доступа к закрытым ключам. Например, связка с закрытыми ключами может вообще лежать на не подключеной в данный момент флешке, а рассчитать достоверность ключа адресата всё равно можно.
Гость (03/12/2012 05:18)   
sentaus только что ведь исчерпывающе ответил

В принципе, понятно. Я имел в виду, что логика могла бы быть и более сложной, типа такой:
IF приватный ключ есть
THEN делаем ключевую пару trust=5
ELSE проверяем значение trust для имеющегося публичного ключа
END
Тогда, если приватного ключа нет, всё работало бы как и сейчас, а если есть, trust автоматически апдейтился бы до 5ти. Чем это плохо? Наверное, есть какие-то side-эффекты в случаях с нетривиальным использованием PGP-ключей, но при типичном использовании было бы больше удобства.
— SATtva (03/12/2012 16:15)   
Пишите Вернеру в gnupg-users. Вряд ли Вам тут кто-то подскажет, какой логикой он руководствовался, вводя именно такое поведение, со свечкой не стояли.
— unknown (03/12/2012 16:37)   
Может быть приватный ключ украден (скопирован без ведома автора), публично распостранён, но не отозван как скомпрометированный. Его можно скачать и поэкспериментировать с ним. Но доверия к его подписям и шифровкам нет уже никакого.

Могут быть и другие варианты разной степени умозрительности. GnuPG ведь предназначен не только для переписки, но и для разных сценариев использования.
Гость (03/12/2012 22:33)   
Может быть приватный ключ украден (скопирован без ведома автора), публично распостранён, но не отозван как скомпрометированный. Его можно скачать и поэкспериментировать с ним. Но доверия к его подписям и шифровкам нет уже никакого.

Да, это реалистичный сценарий, спасибо. Вопрос снят.
— Ajaja (22/12/2012 16:13)   
Имеет ли возможность отправитель данных узнать сессионный ключ в самом банальном случае
gpg -e -r someoneelse somedata


Может. С опцией --debug=4 будет виден сессионный ключ.
— SATtva (22/12/2012 16:16)   
--show-session-key
— Ajaja (22/12/2012 16:19)   
Я имел в виду кри кодировании :
gpg --debug=4 -e -r someoneelse somedata
Будет виден, какой сессионный ключ используется.
Гость (23/09/2013 20:55)   

Возвращаясь к обсуждению опции throw-keyids: хотелось бы иметь такую опцию в gpg.conf, но чтобы она применялась не ко всем ключам, а только к некоторым (если вдруг ширфуем для заданных абонентов, то они всегда должны идти, как hidden-recipient). Можно ли так сделать? Если встроенными средствами не сделать, но есть кривые костыли для реализации, то было бы тоже интересно о них услышать.
— SATtva (24/09/2013 12:30)   
GnuPG не поддерживает скриптование конфига. В рассылке несколько раз об этом просили, но разработчикам такой функционал неинтересен. В принципе, оно и понятно: по-хорошему (чтобы выдержать принципы GNU), надо написать собственный скрипт-обвязку, который будет разбирать опции -r и добавлять нужные параметры, если получатель входит в заданный список. Не вижу в этом ничего костыльного.
Гость (24/09/2013 21:19)   

Jabber-клиент сам по ему одному ведомым законам вызывает gpg для шифрования сообщений. Однако, системные настройки gpg.conf применяются. Как можно заскриптовать тот функционал, который жёстко засунут в сам код программ? Тем более, мне хочется иметь единую политику для контактов, т.е. если я знаю, что у данного абонента нет проблем с throw-keyids, я ему всегда так шифрую: хоть через джаббер, хоть напрямую.

Известно, что некоторые джаббер-клиенты дружат с throw-keyids, другие — нет. Это тоже характеристика, которая принуждает к дополнительным действиям.
— SATtva (25/09/2013 10:08)   
Jabber-клиент сам по ему одному ведомым законам вызывает gpg для шифрования сообщений.

Подозреваю, что он просто вызывает gpg, так что выполнено будет то, что лежит в системном PATH. Замените бинарник gpg (предварительно переименовав) своим скриптом или добавьте путь со скриптом-обвязкой выше в PATH, короче, сделайте так, чтобы при вызове gpg запускался скрипт, который далее будет запускать gpg с нужными параметрами. Это уже костыль, но других вариантов не знаю.
Гость (25/09/2013 20:02)   

Непонятно, как такой костыль сделать. Опция -R (hidden-recipient) принуждает не только опускать keyid получателя, но и шифровать его ключом. Её указание по умолчанию будет означать, что сообщения, адресованные каким-то третьим лицам, будут всегда шифроваться ещё и ключами всех скрытых получателей; требуется же, чтобы опция применялась, только если шифруется для конкретного получателя. Соответственно, механическая замена самого gpg не поможет — надо ещё парсить и распознавать опции, с которыми gpg запускается jabber-клиентом, а я вообще без понятия, каковы эти опции.

В качестве костыля можно сделать вот что: разбить jabber-аккаунт на 2 таких, чтобы в одном были только скрытые получатели, а в другом — нескрытые. Jabber-клиент понимает переменную $HOME и опции GnuPG берёт именно из $HOME/.gnupg (проверено), поэтому указав разные $HOME разным jabber-профилям, где в каждом $HOME/.gnupg будут лежать свои настройки GnuPG, проблему можно решить.
— Беня (25/09/2013 21:28)   

Подменить бинарник gpg на свой скрипт или батник если винда. Код внутри которого выведет на экран командную строку. Т.е. все те аргументы с которыми жабба-клиент пытался вызвать gpg при отправке шифрованного сообщения.
Учитесь слушать, что вам говорят, вместо того, чтобы недостаток своих навыков компенсировать изобретением "обходных маневров".
— SATtva (25/09/2013 21:35)   
Соответственно, механическая замена самого gpg не поможет — надо ещё парсить и распознавать опции, с которыми gpg запускается jabber-клиентом, а я вообще без понятия, каковы эти опции.

Беня пояснил, что я предлагал. Никто не говорил, что это лёгкий путь. Скрипт для начала надо заставить просто писать в отдельный файл, с какими параметрами его вызывают внешние программы, оттрейсить таким образом вызовы jabber-клиента, и отталкиваться от этих данных при написании обвязки.
— Беня (25/09/2013 21:50)   
Кстати, gpg в жаббе — не самое умное решение. Только если поверх OTR-плагина, т.е. для перестраховки.
Гость (25/09/2013 23:11)   

Опять начали пафос разводить? Мой обходной манвёр хорош хотя бы тем, что не требует недокументированных костылей. Это можно сделать универсально и достаточно безопасно, а в вашем случае есть, по меньшей мере, тот минус, что трудно получить полное описание чёрного ящика по такому выхлопу. Вот окажется, что в каких-то нетипичных случаях вызов gpg не таков, как думали, и все keyid'ы утекли. Полностью поручиться за безопасность этой схемы можно, только детально проанализировав код джаббер-клиента, а это непросто. В любом случае, как один из вариантов решения проблемы он принимается, спасибо за пояснение.


OTR — это тоже не самое умное решение хотя бы потому, что там
  1. Жёсткая завязка на AES-128, который не поменять даже на AES-256.
  2. Нельзя писать в оффлайн.
  3. Поддержка OTR менее (IMHO) распространена среди jabber-клиентов, чем PGP.
  4. Требуются дополнительные телодвижения по сверке отпечатков. Всё равно на практике доверие, как правило, устанавливается через PGP, и только через него уже — к отпечаткам ключей OTR.
Первые два пункта разруливаются нестандартными велосипедами, но для этого надо писать код и положить орган на несовместимость с другими клиентами. Или у вас есть какие-то другие аргументы? Для PFS в PGP можно время от времени менять подключи шифрования. Это костыль, но он, IMHO, приемлем и с лихвой покрывает те минусы, что озвучены в п.1 и 2. Пункты 3 и 4 — номинально мелочь, упомянуты к слову.
— sentaus (25/09/2013 23:48, исправлен 25/09/2013 23:49)   
OTR — это тоже не самое умное решение хотя бы потому, что там

1. Это не столь существенная проблема. Серьёзно, проблема из пункта 2 куда более существенна на практике.
2. Это последствия мер против всяких атак с повторной передачей сообщения. Кстати, openpgp для джаббера не предусмотрено стандартного способа передачи шифрованных+подписанных сообщений. В принципе, очевидный костыль вкручивается легко, только кто ж его сам сделает при реализации XEP?

— Беня (26/09/2013 00:47)   

Да он дерьма не стоит. По сравнению с проксированием вызовов gpg. Вначале для трассировки и принятия решения о том надлежащим ли образом жабба-клиент использует gpg. А потом для автоматизированного парсинга и контроля того, с какими параметрами на самом деле будет шифроваться переписка. Вплоть до корректировки на лету или явного запрета с выкидыванием алерт мессаджа. О том, что жабба-клиент взломан и стал вызывать gpp со странными параметрами.

Модель доверие через PGP гораздо хуже протокола социалиста миллионера в OTR.
Использовать замену подключей вместо настоящего perfect forward secrecy может только идиот с большим самомнением. Не говоря уже о том, что при регулярной замене подключей вообще не должно быть никакой суеты вокруг throw-keyids при использовании gpg в жабба-клиентах. Если охота анонимности от владельцев жабба-сервака, то и надо использовать pgp-ключи сгенеренные специально для использования в жаббе. Либо вообще юзать gpg/pgp-шифрование внутри OTR-сессии.

Развели от нехрен делать демагогию, как и с неубиваемыми визитками.
— SATtva (26/09/2013 07:22)   
Чуваки, давайте-ка без перехода на личности.

Для PFS в PGP можно время от времени менять подключи шифрования.

Подключи в OpenPGP не дают свойства PFS. Разве что передавать ключ получателю, минуя сервер ключей, и требовать, чтобы он удалял старые подключи со связки (причём безопасным образом). В общем, забудьте.
Гость (26/09/2013 09:42)   
Подключи в OpenPGP не дают свойства PFS
А разве нельзя удалить у себя secret key к старому подключу? Тогда получится PFS.
— SATtva (26/09/2013 09:49)   
Можно (с аналогичными требованиями к процедуре удаления), но и корреспондент должен делать то же самое со своим ключом, у вас ведь с ним не односторонняя связь.
— sentaus (26/09/2013 11:12)   
Да и желательно будет делать всю эту процедуру перед каждым новым сеансом, и в результате опять писать в оффлайн нельзя, иначе хотя бы одно сообщение будет со старым ключом. В общем сложно это все, и думать много надо на каждом шагу.
Гость (27/09/2013 06:25)   

В свете новостей от АНБ я бы не был столь категоричен, но да, большинство считает именно так, как вы написали.


А что, в OTR сообщения подписываются и есть защита от переотправок? Не слышал о таком. В любом случае, я не вижу связи между возможностью писать в оффлайн и атаками с повторной передачей сообщений (разве что защита от последних реализована такими кривыми костылями, что затрагивает первое?).


Разработчики tkabber[link9], вестимо. Им плевать на XEP. SATtva подтверждает.


Беня, gyhsal, Рус[link10] и Славянин[link11] — одно лицо? До их прихода тут никто не ставил точки от балды:
<> не стоит. По сравнению с <>. Вначале для <>. А потом <>. Вплоть до <> мессаджа. О том, что <>.»
в то время как правильный вариант:
не стоит по сравнению с <> вначале для <>, а потом <> вплоть до <> мессаджа о том, что <>.
B все до одного — фанаты винды. Совпадение? :)

То, о чём вы пишете, это, конечно, прекрасно, но это другая, более серьёзная модель защиты. Отвечать этим на моё — это как на вопрос о проверке уязвимостей в коде отвечать «А ты компилятор проверил? Вдруг в нём баги, Проверка кода на ошибки дерьма не стоит, надо проверять компилятор».

Всё-таки я исходил из того, что у меня есть некоторое доверие к конкретному jabber-клиенту (ну, или его автору), и я не рассматриваю пока вопрос ошибок (как злонамеренных, так и вообще) в его коде. Однако, даже если исходный функционал не содержит ошибок, влезание в него своими грязными лапами без хорошего понимания того, как он работает — грязный хак, часто приводящий к эпическим фейлам. Я считаю, что надо придерживаться одной из двух стратегий: либо вообще не лезть внутрь, либо, если лезть, то лезть досконально и со всем разбираться. Люди массово предпочитают первое, т.к. второе требует несоизмеримо больших усилий и квалификации.

С грязными хаками в коде я уже однажды напарывался на проблемы, когда хотел отключить информацию о типе и версии jabber-клиента. Один добрый хакер поглядел код, сказал, какие строчки в нём поправить, я ему поверил, исправил и перекомпилил. До поры до времени всё было хорошо, на request version jabber-клиент действительно молчал как рыба, но потом ВНЕЗАПНО выяснилось (а могло бы и не выясниться, сойдись звёзды по-другому), что при коннекте (выходе из offline в online) jabber-клиент всё-таки рассылает информацию о том, кто он есть. И абоненты того же Psi, если наведут мышкой на ростер, эту информацию (по крайней мере, в некоторых случаях) отчётливо увидят после первого коннекта. В общем, кулхацкерство без понимания — это очень плохо. Умение «читать код» (чем тут многие кичатся) без понимания всей системы, протокола, архитктуры программы и связи между её компонентами не даёт ровным счётом почти ничего. Очень велика вероятность сделать своими правками только ещё хуже.


It is often used as a cryptographic protocol that allows two parties to verify the identity of the remote party through the use of a shared secret, avoiding a man-in-the-middle attack without the inconvenience of manually comparing public key fingerprints through an outside channel. In effect a relatively weak password/passphrase in natural language can be used. [link12]

Для отрицаемости в смысле OTR оно, конечно, лучше, но вообще это настолько разные звери, что их сравнивнение не очень осмысленно. Идея PGP в том, что у вас есть один ключ для всех абонентов и, более того, он публично известен, при SM же (socialist millionaire) свой предрасшаренный секрет надо иметь для каждой пары абонентов. Кроме того, нет никакой формальной процедуры установления доверия при утере или компрометации секрета, что есть в PGP (при компрометации текущих подключей PGP можно сгенерить новые, пользуясь главным ключом, хранящимся на неподключенных к сети машинах/носителях).


Why not?


throw-keyids — это, конечно, рюшечки поверх остального. Однако, если их можно сделать, и от этого никому не станет хуже, то почему бы не сделать? throw-keyids — скользкий момент хотя бы потому, что скрытие своего ключа определяется настройками gpg вашего абонента, а не вашими. Тем не менее, никто не запрещает создать специальный анонимный PGP-ключ, передать его абонентам по шифрованному каналу, попросив абонентов не выкладывать его на сервера ключей, а потом сверху ещё и включить throw-keyids. И, да, это может ещё и сочетаться со сменой подключей в PGP-связке.


Одно не отменяет другого, как я вам выше написал.


Да, тоже можно, хотя это и не будет полноценным OTR в том смысле, что злонамеренный абонент в этом случае имеет все те же рычаги, что и при голом PGP без OTR.


Какой-то терминологический спор получается. Что конкретно вы понимаете под PFS? Невозможность расшифровать старые сообщения? Это гарантируется тем, что подключи время от времени отзываются, копии их отовсюду удаляются, а на связку добавляются новые подключи. Естественно, в идеале это должны проделывать оба абонента, но если проделывает только один, то это тоже имеет смысл. На все претензии к выдаче ключа шифрования к сообщениям будет стандартный ответ: они были зашифрованы старыми подключами (что, в том числе, подтвердят и логи jabber-сервера), подключи отозваны (если противник получит доступ к PGP-ключу, он сам в этом убедится), а старых копий более нет (в этом его не убедить, конечно, но если сам всё честно стёр так, что восстановить не можешь, то уже не выдашь старые подключи даже под пытками). Конечно, остаётся риск выдачи текущих подключей, но на них будет завязано лишь небольшое количество информации (например, за последнюю неделю или месяц). Выдача текущих подключей в том или ином виде присутствует и в каноническом OTR: если противник перехватит живую сессию, то OTR не спасёт. Разница здесь лишь в том, что одна сессия в OTR — это промежуток непрерывного онлайна (вроде во время сессии OTR не меняет ключи, но могу ошибаться), а в PGP со сменой подключей — время действия подключей. Параллелизм сохраняется в любом случае.

Если же вы под PFS понимаете невозможность доказать авторство (в том смысле, в каком оно есть в OTR), то это тоже решается. Для этого достаточно тотально выпилить подписи из jabber-клиента, воспользовавшись PGP-ключом, который не поддерживает ЭЦП. Лично не тестировал такой способ, но поидее он должен работать. Может быть, jabber-клиент при этом будет ругаться, но если работать продолжит, то, думаю, всё ОК. В любом случае, из-за XEP сообщения в почти всех клиентах не подписывались и ранее, так что ничего не теряем, кроме подписи статусов, но последнее, IMHO — вообще рюшечка, скорей всего, сделанная только для того, чтобы jabber-клиенты могли автоматически распознавать, у кого какой keyid на jid'е, и автоматически выбирать нужный ключ из связки.

Кстати, раз зашла речь про PFS в OTR, задам вопрос: что может сделать полностью злонамеренный абонент при использовании OTR? Понятно, что он владеет собственным приватным ключом, публичным ключом второй стороны, выхлопами всех шагов протокола DH и результирующим симметричным ключом. Если он всю эту информацию соберёт вместе и выдаст третьему лицу, докажет ли он этим самым, что общался конкретно с тем абонентом, или нет? Вопрос чисто математический, т.к. юридический ответ очевиден: докажет в любом случае (как с OTR, так и без него), ссылаясь на тайминги сообщений и то, что админы jabber-сервера вместе с провайдерами обоих абонентов их не стали бы подделывать, т.е. 4 стороны могут подтвердить тайминги (если одна из сторон полностью анонимна и использует Tor, задача усложняется, но лишь количественно, а не качественно).


Если есть непреодилимое желание иметь ключ ровно на одну сессию, то да. Предполагаю, многих бы устроила «забывчивость» ключей и через неделю или месяц.


Даже если вам хочется именно этого (ключ на одну online-сессию), никто не запрещает выслать публичный подключ для новой сессии, пока общаетесь в старой. Кроме того, это и в OTR решается, была бы воля для стандартизации:

мог бы ведь юзать ключ тот, который был в последнем сеансе, технически это ничему бы не противоречило, достаточно договориться о стандарте. [link13]

при первом же следующем выходе абонента в онлайн ключи могли бы меняться на другие [rekeying или как там это в протоколах называется, ротация ключей короче ;)] [link14]

Я именно эти аргументы имел ввиду выше во фразе

Первые два пункта разруливаются нестандартными велосипедами, но для этого надо писать код и положить орган на несовместимость с другими клиентами.
— sentaus (27/09/2013 08:00, исправлен 27/09/2013 08:01)   
А что, в OTR сообщения подписываются и есть защита от переотправок?

Ещё как. MAC с сессионным ключом в каждом сообщении, да ещё MAC предыдущего вставляется в сообщение. При двустороннем канале каждый уверен в подлинности сообщения, но не может её доказать потом третьему лицу. Сообщение из другой сессии не расшифруется (это впрочем ещё PFS обеспечивается), а повтор сообщения из той же сессии тоже может быть отслежен на другом конце автоматически.


Если он всю эту информацию соберёт вместе и выдаст третьему лицу, докажет ли он этим самым, что общался конкретно с тем абонентом, или нет

Вообще нет. MAC может сгенерировать любая сторона.


Разработчики tkabber, вестимо. Им плевать на XEP.

В общем, всё плохо с совместимостью. Примерно как с браузерами во времена IE.


Даже если вам хочется именно этого (ключ на одну online-сессию), никто не запрещает выслать публичный подключ для новой сессии, пока общаетесь в старой.

Это всё ручное, приходится фактически реализовывать протокол в своей голове. Собственно, это и есть самая большая трудность.

Гость (27/09/2013 08:13)   

Понятно.


Хорошо было бы это проверить в реальных имплементациях OTR на реальных jabber-клиентах, а то вдруг не поругаются на переотправку...


Некоторые jabber-клиенты умеют включать одновременно как OTR, так и PGP. Когда-то разбирались, но я в упор не помню, что идёт внутри, а что снаружи при таком нестандарте. Ну, ещё могут всякие неожиданные сюрпризы вылезти в таком «каскаде» — всё-таки протоколы писались не под этот случай, мало ли на что это повиляет... а то как бы ни получилось, что будет хуже, чем каждый из методов (PGP и OTR) по отдельности.
— SATtva (27/09/2013 08:55)   
Тем не менее, никто не запрещает создать специальный анонимный PGP-ключ, передать его абонентам по шифрованному каналу, попросив абонентов не выкладывать его на сервера ключей, а потом сверху ещё и включить throw-keyids.

Либо вообще юзать gpg/pgp-шифрование внутри OTR-сессии.
Да, тоже можно, хотя это и не будет полноценным OTR в том смысле, что злонамеренный абонент в этом случае имеет все те же рычаги, что и при голом PGP без OTR.

Определитесь с моделью угрозы. Непонятно, входят в неё атаки со стороны корреспондента или нет.

Какой-то терминологический спор получается. Что конкретно вы понимаете под PFS? Невозможность расшифровать старые сообщения? Это гарантируется тем, что подключи время от времени отзываются, копии их отовсюду удаляются, а на связку добавляются новые подключи.

Тут, очевидно, от корреспондента требуется не просто следование коммуникационному протоколу, а полное соблюдение операционной безопасности. В зависимости от модели угрозы (а она у Вас, насколько понимаю, очень жёсткая), схема PFS с PGP-ключами получается очень хрупкой, она не выдерживает случайный fuck up со стороны корреспондента или его системы.

Хоть PFS, формально, не требует рилтаймовости, это всё-таки важное свойство. В том же OTR сеансовый ключ вырабатывается сторонами интерактивно (именно по этой причине нельзя писать в оффлайн), хранится только в ОЗУ, параметры не сохраняются. В случае с OpenPGP исходный материал лежит на диске; его можно уничтожить (или изначально размещать в tmpfs), но это уже нетривиальная задача, которую обязаны исполнять оба корреспондента. Если противник сможет восстановить материал удалённых подключей у любого корреспондента, свойство PFS (невозможность ретроактивной расшифровки коммуникаций) рушится как минимум для сообщений одного из корреспондентов. На мой взгляд, такая хрупкость полностью противоречит подразумеваемой модели угрозы, я бы на Вашем месте так не рисковал.

Если же вы под PFS понимаете невозможность доказать авторство (в том смысле, в каком оно есть в OTR), то это тоже решается.

Это уже отрицаемость, а не PFS, такой смысл я не вкладывал.

Это всё ручное, приходится фактически реализовывать протокол в своей голове. Собственно, это и есть самая большая трудность.

Именно.
Гость (27/09/2013 11:03)   
OTR глючное какое-то во многих jabber-клиентах. Например, в ответ на команду /otrpolicy default always выдаёт

(process:XXXX): GLib-CRITICAL **: g_hash_table_foreach: assertion `version == hash_table->version' failed

хотя otrpolicy меняется. Если класть OTR поверх PGP, то глюки ещё больше множатся.

Есть ещё проблема первого сообщения:

(default|jid) (plain|manual|opportunistic|always)
Sets either the default policy or the policy for the given jid The plain policy should never be used, because you won’t be able to receive or send any OTR encrypted messages. If you set the policy to manual, you or your chat partner have to start the OTR encryption by hand (e.g. with /otr start). The policy "opportunistic" does that itself by sending a special whitespace-sequence at the end of unencrypted messages. So the other OTR-enabled chat client knows, that you want to use OTR. Note that the first message will always be unencryted, if you use this policy. With the policy "always" no message will be sent in plain text. If you try to sent the first message unencrypted, mcabber will try to establish an OTR channel. Please resend your message, when you get the information that the channel was established. If someone sends you plaintext messages while the policy is set to "always", you’ll be able to read the message but it won’t be saved to the history.
© man mcabber

Вроде бы для always проблемы первого сообщения нет, но всё равно остаётся какое-то чувство неуверенности. И в чём отличие opportunistic от always? Почему во втором случае оно может начать протокол само без посылки нешифрованных сообщений, а в первом нет?

Для работы с оффлайном OTR мог бы иметь отдельный ключ, который бы менялся только во время online-сессий, а шифрование сообщений, посылаемых в online, могло бы происходить так же, как оно работает сейчас.

Ещё один минус OTR — его ключи. Приватный ключ OTR хранится в виде простого текстового нешифрованного файла. Никаких тут пассфраз, аналогов gpg-агента и прочего. Т.е. безопасность OTR-ключа заведомо низкая.
— SATtva (27/09/2013 11:27, исправлен 27/09/2013 11:39)   
Вроде бы для always проблемы первого сообщения нет, но всё равно остаётся какое-то чувство неуверенности. И в чём отличие opportunistic от always?

По-видимому, в том, что opportunistic даёт сигнал отвечающей стороне инициировать OTR-сессию, если там в клиенте есть поддержка OTR, но если поддержки нет, отвечающая сторона сможет прочитать сообщение; always же принудительно запускает OTR-сессию отправителем: если отвечающая сторона не поддерживает OTR, то прочитать ничего не сможет.


Для работы с оффлайном OTR мог бы иметь отдельный ключ, который бы менялся только во время online-сессий, а шифрование сообщений, посылаемых в online, могло бы происходить так же, как оно работает сейчас.

Посоветуйте это разработчикам OTR. Думаю, они не стали добавлять поддержку оффлайна, чтобы чрезмерно не усложнять протокол.

Гость (27/09/2013 11:45)   

Если номинально, то не входят. Однако, если их можно включить в модель защиты, не особо чем-то жертвуя, это безусловный плюс. Не всё, что здесь озвучивается, реализовывается на практике, как и не всё, что реализовывается на практике, здесь озвучивается. Скорее была попытка понять, какие кирпичи есть, и какие у них свойства, как из них можно построить систему защиты под конкретные случаи жизни.


В худшем случае противник получит, допустим, историю сообщений, взятую с диска. Этого часто «достаточно» почти для всего. OTR не запрещает писать историю. Кто-то может историю не писать, другие — стирать её время от времени, но смысл остаётся: этот факт непроверяем для другой стороны.


Естественно, но никто этого не отрицал. С другой стороны, доступ к приватному ключу можно получить, только имея доступ к компьютеру абонента, но имея последний, необходимость что-либо расшифровывать часто пропадает, т.к. есть файлы истории отправленных/полученных сообщений. Если мы вынуждены верить в то, что они вовремя трутся, а не хранятся годами, почему мы не можем поверить в то, что трутся бэкапы старых секретных подключей? В общем, PFS на практике не работает. :-) С юридической отрицаемостью всё совсем плохо, а техническая отрицаемость полагается на непроверяемые аргументы типа «абонент не пишет историю сообщений».


PFS защищает от редкого катастрофического события. Если оно не произлошло, допустим, за минувший год, то нет никакой разницы между тем, когда стороны использовали OTR и и не писали историю, и тем, когда стороны использовали PGP с временными подключами, которые были позже уничтожены, а история потёрта. И то и то — могила для информации. Если атака происходит во время условной «сессии», то да, тут есть некоторые отличия, но опять же... ИБ — оценка рисков. Стоит ли так мучиться со стандартным OTR, если вероятность такого развития событий достаточно мала? Может, целесообразней заменить OTR суррогатом с временными ключами? Вроде как ничего не теряем в функциональности, и в то же время оно «по духу почти PFS», хоть и на других временных масштабах.


Я понимаю, как оно по смыслу, но вопрос в том, почему так. Могло бы быть и иначе: при opportunistic клиенты обмениваются служебными пакетами данных, и если установить канал удаётся, то все сообщения, включая первое, отсылаются только после установления OTR-канала; если же клиенты выясняют, что поддержки OTR одна из сторон не имеет, то они не насилуют друг друга и всё шлют без шифрования (как первое сообщение, так и последующие). В такой схеме opportunistic шифровало бы всё в точности как always (хоть и без подстраховки), если оба клиента умеют OTR, а не так как сейчас.
— sentaus (27/09/2013 11:51, исправлен 27/09/2013 11:52)   
Стоит ли так мучиться со стандартным OTR, если вероятность такого развития событий достаточно мала? Может, целесообразней заменить OTR суррогатом с временными ключами?

Третий раз: в текущем суррогате на основе openpgp мучений больше. Пусть даже они и кажутся простыми.

— SATtva (27/09/2013 12:07, исправлен 27/09/2013 12:10)   
В зависимости от модели угрозы (а она у Вас, насколько понимаю, очень жёсткая), схема PFS с PGP-ключами получается очень хрупкой, она не выдерживает случайный fuck up со стороны корреспондента или его системы.

В худшем случае противник получит, допустим, историю сообщений, взятую с диска. Этого часто «достаточно» почти для всего. OTR не запрещает писать историю. Кто-то может историю не писать, другие — стирать её время от времени, но смысл остаётся: этот факт непроверяем для другой стороны.

Я говорю даже не о целенаправленных атаках корреспондента или о его сговоре с атающим, а о случайных ошибках на стороне корреспондента. То, что Вы предлагаете, опасно именно с этой точки зрения. Сторонам нетрудно договориться не писать историю, но труднее договориться и реализовать надёжное удаление подключей OpenPGP с диска.


Стоит ли так мучиться со стандартным OTR, если вероятность такого развития событий достаточно мала? Может, целесообразней заменить OTR суррогатом с временными ключами?

Странная постановка вопроса. По-моему, если вероятность события невысока, то нет смысла вообще городить огород, на котором в процессе реализации можно неочевидным образом подорваться. Можно просто использовать PGP с регулярно заменяемыми подключами, только не надо называть это PFS.


Опять же, полностью согласен с sentaus'ом. Вы пытаетесь приспособить некий механизм для целей, для которых он не создавался.


Могло бы быть и иначе: при opportunistic клиенты обмениваются служебными пакетами данных, и если установить канал удаётся, то все сообщения, включая первое, отсылаются только после установления OTR-канала; если же клиенты выясняют, что поддержки OTR одна из сторон не имеет, то они не насилуют друг друга и всё шлют без шифрования (как первое сообщение, так и последующие).

Тогда это уже по определению не opportunistic, а обычное начало протокола с согласованием параметров. Опять же, разговор о том, как могло или не могло быть, надо адресовать разработчикам. (Мне например, сходу не понятно, как бы плагин мог произвести такое согласование. Слать какие-то данные, не спрашивая пользователя? В какой момент? Тут много неочевидных нюансов.)

Гость (27/09/2013 12:29)   

А в OTR нельзя писать в оффлайн, что с лихвой компенсирует весь недостаток мучений. :-) Согласованно сменить раз в месяц или год подключи, по-моему, проще, чем каждый день мучиться с тем, что в оффлайн не напишешь, а выхода абонента в онлайн можно ждать часами. Конечно, на пожарный случай можно писать и в оффлайн, шифруя сообщения с помощью PGP руками и применяя опцию -R, но это геморрой. И расшифровывать их потом руками тоже геморрой.


Я потому сразу сказал, что спор скорее терминологический. :-) Основная цель — отмывать ключ, который загрязнён большим количеством прошедшей через него информации. Если этого не делать совсем (не менять подключи), то рано или поздно на нём накапливается столько грязи, что это катастрофа. И все до одного секрета (в том числе, давно стёртые с дисков) остаются завязаными на один ключ. Вот этого и хотелось избежать в самую первую очередь. Всё остальное опционально.


В «обычном начале протокола с согласованием параметров» (допустим, политика always) если что-то не работает или не поддерживается, то не будет отослано ничего, в мной же предложенном случае сообщение отошлётся открытым текстом (как первое, так и последующие). Однако, они реализовали opprtunistic по-другому — так, что первое сообщение пойдёт открытым текстом даже тогда, когда всё ОК, работает и поддерживается у обеих сторон. Вот этот момент я и не могу понять. Почему бы не сделать этот конкретный случай (всё ОК, работает и поддерживается у обеих сторон) идентичным always?


В opportunistic при попытке отослать первое сообщение online-контакту производится попытка установить OTR-канал и согласовать параметры. Если она срабатывает, то дальше идёт OTR, если нет, то plain text'ом. Т.е. алгоритм, думаю ясен. Вроде как именно такой механизм подразумевается в документации, но у меня лично опыта работы с opportunistic мало нет совсем.
— unknown (27/09/2013 14:26, исправлен 27/09/2013 14:40)   
что может сделать полностью злонамеренный абонент при использовании OTR? Понятно, что он владеет собственным приватным ключом, публичным ключом второй стороны, выхлопами всех шагов протокола DH и результирующим симметричным ключом. Если он всю эту информацию соберёт вместе и выдаст третьему лицу, докажет ли он этим самым, что общался конкретно с тем абонентом, или нет? Вопрос чисто математический

Именно для того протокол и создавался, что после того как согласован симметричный ключ аутентификации, абонент может насочинять посредством этого ключа любые произвольные сообщения.


Это напоминает идею кольцевых подписей, которую хотелось бы видеть реализованной в GnuPG: общая кольцевая подпись вида "сообщение подписано или A, или B, или обоими A+B, но точный ответ неизвестен", причём такую подпись можно делать без согласования и без разрешения включать кого-то в своё кольцо. Если сторона B получает такое сообщение от A, то она знает, что оно подписано A, т.к. сама сторона B его не подписывала, сама себе не отсылала и раздвоением личности не страдает. А третьей стороне это уже не доказать.


В OTR также, только PFS+OTR+{более гибкая аутентификация} в одном флаконе: согласовали сеансовый симметричный ключ, отвязали его от сеанса асимметричного согласования (на нём самом чей-либо подписи не стоит, а согласование происходит одновременно, т.к. последний шаг вывода симметричного ключа из вычислений по параметрам DH-сессии делается обеими сторонами параллельно), для шифрования и аутентификации (или для шифрования и аутентификации выводятся два разных симм. ключа?) и он симметрично аутентифицирует сообщения. Каждая сторона знает, что то, что не аутентифицировала она, аутентифицировано другой стороной. А для третьей стороны это недоказуемо: кто из двух мог подделать аутентификацию и подделывал ли вообще.


техническая отрицаемость полагается на непроверяемые аргументы типа «абонент не пишет историю сообщений».

Идея в том, что технически они для третьей стороны не аутентифицированы. То, что вы называете "юридической отрицаемостью" просто опять же, ваша специфическая модель угрозы. OTR задумывалось не для вашего сценария, а для другого. Например, вы переписывались с известным чеовеком, а затем слили его откровения в паблик. Если они подписаны или строго аутентифицированы, то все вам поверят. Если используется OTR, то ваш слив засчитан недоказан — вы могли полностью сочинить или исказить текст переписки.


Вас же интересует юридическая отрицаемость в плане защиты самого себя на неких следственно-судебных-розыскных мероприятиях. Здесь если только свой скрытый сервис в Tor подымать со своим Jabber-cервером и покрывающим трафиком (или аналогом Torchat). Но городить протокол на коленке, тем более только со своей стороны, смысла нет.


Кстати, записываемости в OTR нет ещё и чисто идеологически. Раз разглашение переписки недоказуемо, то нечего её записывать, вдруг будет случайная утечка, лучше поговорить и сделать вид, что ничего не было. А раз сторона предприняла меры к записи, то она делала это злонамеренно, её можно обвинить в том, что она пыталась выудить компромат из переписки и она также могла заранее предпринять меры к подделке сообщений. Как и в каких сценариях это (не)прокатит юридически, выше уже рассмотрено, в т.ч. и в вашем сообщении.

Гость (28/09/2013 00:39)   
Про OTR и писание в оффлайн, это решаемо. Например, так же как решили сделать[link15] в «TextSecure» — обычный «prekey».
Гость (28/09/2013 02:19)   

В идеале — да, и этот вопрос тоже прорабатывается. Суть в том, что не получится сделать так, чтобы у каждого абонента был свой jabber-сервер на скрытом ресурсе — это несовместимо с особенностями XMPP-протокола из-за его глубинной завязки на продвинутые фичи DNS. Единственное, что можно сделать — поставить один jabber-сервер на каком-то скрытом ресурсе и заставить всех регистрироваться именно на нём; на другие jabber-сервера он передавать сообщения не сможет.

Естественно, сервер нужен, потому что хочется иметь возможность писать в оффлайн, когда один из клиентов вообще физически не подключен к сети. При этом возникает плата за сообщения в оффлайн — третья сторона (пусть даже и анонимная, но всё же), который хранит весь список контактов, через неё проходят все сообщения (пусть даже шифрованные) и т.д., в то время как в идеале хотелось бы чего-то типа P2P-мессенджера без третьей (и в каком-то смысле доверенной) стороны. Всё трудно и непросто, и даже чисто идеологически неясно, как правильно строить защиту.


«Протокол» — это слишком громко звучит для процедуры «сменять подключи время от времени». Вон, посмотрите, даже SATtva подключи меняет; можете считать, что я у него понабрался.


Может, вы хотели сказать про запись сенасовых или временных ключей, а не переписки? Всё-таки запись переписки — ортогональная вещь к её шифрованию. В jabber-клиентах это регулируется разными опциями, никак друг с другом несвязанными, да и запись обычно ведётся не для злонамеренности, а для упрощения использования переданной информации во вполне легитимных целях (иначе пришлось бы всё, что хоть сколь-нибудь важно и может впоследствии пригодиться, записывать руками во внешний файл). К тому же, при незаписывании переписки при внезапном падении jabber-клиента или проблемах с сетью может быть утеряна важная многочасовая дискуссия, и что тогда? Её заново создавать с нуля?

Сейчас jabber (да и вообще, если глобально, разные IM-системы) заменил фактически все способы коммуникации в силу своей простоты, безопасности, удобства и практичности. Через jabber у кого-то может проходить масса деловой и важной переписки, и незаписывать её вообще — сильно терять в практичности. В общем, jabber — это не «привет, как дела?», которые нестрашно потерять, поэтому разумно вручную разбирать переписку и удалять её только после экстрагирования важных сведений во внешние файлы.


Они тут[link16] пишут:

The TextSecure Protocol

TextSecure’s upcoming iOS client (and Android data channel client) uses a simple trick to provide asynchronous messaging while simultaneously providing forward secrecy.

At registration time, the TextSecure client preemptively generates 100 signed key exchange messages and sends them to the server. We call these “prekeys.” A client that wishes to send a secure message to a user for the first time can now:

  1. Connect to the server and request the destination’s next “prekey.”
  2. Generate its own key exchange message half.
  3. Calculate a shared secret with the prekey it received and its own key exchange half.
  4. Use the shared secret to encrypt the message.
  5. Package up the prekey id, the locally generated key exchange message, and the ciphertext.
  6. Send it all in one bundle to the destination client.

The user experience for the sender is ideal: they type a message, hit send, and an encrypted message is immediately sent.

The destination client receives all of this as a single push notification. When the user taps it, the client has everything it needs to calculate the key exchange on its end, immediately decrypt the ciphertext, and display the message.

With the initial key exchange out of the way, both parties can then continue communicating with an OTR-style protocol as usual. Since the server never hands out the same prekey twice (and the client would never accept the same prekey twice), we are able to provide forward secrecy in a fully asynchronous environment.

Честно сказать, мне лень сейчас глубоко задумываться о том, безопасен ли их протокол, но у меня есть сомнения, касающиеся того, как эти «100 prekeys» дружат с отрицаемостью и PFS, случись что. Безопасность их метода может быть и хуже, но это не страшно, если все понимают и отдают себе отчёт в том, от чего защищает канонический OTR, но не защищает их метод.


На одном известном примере все могли убедиться, что технические доказательства мало кого волнуют, даже если есть очевидные сомнения[link17] в их валидности. Насколько мне известно, полный детальный технический разбор ситуации так никто и не сделал. Всё это ещё раз подталкивает к тем мыслям о юридической отрицаемости, которые я озвучил. С большой вероятностью фактическое убеждение третьей стороны в истиности переписки будет вестись методом «кто громче заявит», «о чём скажут по телевизору» и «чей PR будет чернее», при этом лишь единицы заинтересуются деталями технических нюансов.

P.S. Я нашёл ошибку в GnuPG!
--no-sig-cache
Do not cache the verification status of key signatures. Caching gives a much better performance in key listings. However, if you suspect that your public keyring is not save against write modifications
© man gpg

Ссылки
[link1] http://minskyprimus.net/sks/

[link2] https://www.pgpru.com/servisy/packetdump

[link3] https://www.pgpru.com/forum/offtopik/kriptografyiacrnehotjatispoljzovatjjava

[link4] http://eprint.iacr.org/2010/625

[link5] https://www.pgpru.com/faq/shifrovanie#h50-6

[link6] https://www.pgpru.com/forum/rabotasgnupg/anonsyvyhodaversijj

[link7] https://www.pgpru.com/biblioteka/osnovy/setjdoverija

[link8] https://www.pgpru.com/comment58479

[link9] https://www.pgpru.com/comment41042

[link10] https://www.pgpru.com/comment60993

[link11] https://www.pgpru.com/comment60387

[link12] https://en.wikipedia.org/wiki/Socialist_millionaire

[link13] https://www.pgpru.com/comment51943

[link14] https://www.pgpru.com/comment51976

[link15] https://www.pgpru.com/forum/kriptografija/forwardsecrecyposhlovmassy

[link16] https://whispersystems.org/blog/asynchronous-security/

[link17] https://www.pgpru.com/comment52900