Показаны сообщения с ярлыком ЭЦП. Показать все сообщения
Показаны сообщения с ярлыком ЭЦП. Показать все сообщения

пятница, 19 июля 2013 г.

HOWTO: использование ЭЦП и шифрования на практике

Часть первая

Часть вторая

Использование ключей для шифрования и для подписи.

Напомню краткое содержание первой части: там мы разобрали вопрос полезности ключей, а также их генерации. ИМХО полезно составить небольшую шпаргалку:


# создание нового ключа
gpg --gen-key 
# создаёт новые ключ. Ещё раз напомню, что СЕКРЕТНЫЙ КЛЮЧ ДОЛЖЕН БЫТЬ СВОЙ У КАЖДОЙ СИСТЕМЫ.

# список ключей
gpg --list-keys
gpg --list-keys KID
# список ключей и их субключей. 
# NOTE: можно добавить параметр KID -- уникальный кусок чего-то от какого-нить ключа.
# К примеру, если у меня только одни ключ содержит XYZ в имени или в описании или в почтовом адресе,
# я могу добавить только XYZ, и gpg выведет только этот ключ. Это верно и для многих других команд.
# также можно использовать ID ключа -- уникальное шестнадцатеричное восьмизначное число,
# которое выводится в списке ключей и в других случаях (это последние цифры отпечатка ключа, см. ниже)

# редактирование ключа
gpg --edit-key KID
# (см. выше NOTE, верно и для KID)
# подробности ниже

# экспорт ключа
gpg --export KID
gpg --armor --export KID
# выводит ключ на стандартный вывод
# --armor нужен для вывода в текстовом виде(такое можно смело вставлять в любой текст)

# импорт
gpg --import
# добавление ключа(ключей) из стандартного ввода в в ваше кольцо (keyring).

# шифрование
gpg --encrypt --recipient KID FILENAME
# данная команда шифрует файл FILENAME для KID.
# создаётся новый файл с именем FILENAME.gpg
# который может прочитать только KID
# можно задать несколько реципиентов, в т.ч. и себя, если это например бекап
# допустимо использовать ключ --armor, тогда имя файла будет FILENAME.asc
# и файл будет годен для вставки в любой текст

# дешифровка
gpg --decrypt FILENAME.{asc,gpg}
# расшифровывает файл и отправляет его в ст. вывод(допустимо и в файл с --output)
# для расшифровки нужен секретный ключ одного из реципиентов.

# проверка подписи
gpg --verify FILENAME.{asc,gpg,sig}
# проверяет ЭЦП FILENAME
# подпись может содержаться в самом FILENAME.gpg или лежать отдельно в файле FILENAME.sig или в FILENAME.asc

# подпись файла
gpg --sign FILENAME
gpg --sign --detach-sign FILENAME
# подписывает файл FILENAME
# если использовать --detach-sign, то подпись будет в виде отдельного файла FILENAME.sig
# вместе с --detach-sign можно использовать --armor
# для подписания требуется Ваш секретный ключ

# комбинация шифрования и подписи
gpg --sign --encrypt --recipient KID FILENAME
# шифрование и подпись можно и нужно комбинировать.
# тогда ваш реципиент будет уверен в том, что файл не подделка
# проблема в том, что публичный ключ реципиента известен всем
# в т.ч. и злоумышленнику
# а значит он может просто подменить наше сообщение
 
 
К примеру, Алиса желает отправить сообщение Бобу. У них имеется незащищённое хранилище insecure_storage, пусть это будет обычный каталог, к которому смонтированно облако яндекс-диска. Т.о. если Алиса просто отправит туда message, то злоумышленник может его не только прочитать, но и изменить. На компьютере Алисы
cp message insecure_storage/
На компьютере Боба
cp insecure_storage/message .
Тем временем на компьютере КровавойГБни
cp insecure_storage/message .
vim message
# Вау!
cp message insecure_storage/message
т.о. в иттоге Боб получит перлюстрированное и исправленное message. ИЧСХ, даже об этом не узнает, а будет уверен, что это личное дело между ним и Алисой.  

Как избежать такой атаки?

Шаг №1: Алиса и Боб создают свои ключи, и отправляют их в insecure_storage. Создание ключей уже обсуждалось. Экспорт осуществляется ключом ---export, например на компьютере Алисы

Сначала экспортируем свой ключ
gpg --export Alice >insecure_storage/alice.key
Теперь забираем ключ Боба
gpg --import insecure_storage/bob.key

(очевидно, Боб должен сделать тоже самое)

Шаг №2
В принципе, теперь Алиса может смело шифровать своё message

gpg --sign --encrypt --recipient Bob message
cp message.gpg insecure_storage/
Но не всё так просто...

Кровавая ГБня может с лёгкостью подменить insecure_storage/alice.key на свой. В дальнейшем она может непрерывно отслеживать insecure_storage, и постоянно подменять там message от Алисы на  свои, подписанные фейковым ключом. Боб этого не заметит. Также Кровавая ГБня может подменить insecure_storage/bob.key, и потому Алиса будет шифровать не для Боба, а для Кровавой ГБни. Ей(ГБне) останется только вовремя удалить insecure_storage/message от Алисы, прочитать фейковым ключом якобы Боба, а потом подписать фейковым ключём якобы Алисы и зашифровать настоящим ключом Боба. При этом Боб никак НЕ узнает, что message прочитано, и при необходимости изменено.

Данная ситуация НЕ решается в данных условиях. Имея только insecure_storage наладить связь невозможно. К счастью, не всё так трагично. В нашем сегодняшнем мире циркулируют тысячи гигабайт мусора во всех направлениях, и отследить их все в принципе невозможно.

Единственное, что нужно Алисе -- доказать Бобу, что она, это ОНА, а вовсе не Кровавая ГБня. В качестве доказательства можно использовать третью сторону, но это не слишком безопасно и надёжно (Кровавая ГБня может отслеживать третью сторону, и с помощью ректального криптоанализа _может_ заставить её делать то, что велит Политика Партии).

В качестве пруфа(доказательства), Алиса может воспользоваться своим отпечатком ключа(fingerprint). Вот к примеру отпечаток ключа моего нетбука

$ gpg --fingerprint amilo
pub   2048R/6D300475 2013-07-18
Отпечаток ключа = E3A9 7C06 C734 B779 92D3  69B5 3494 1316 6D30 0475
uid                  drBatty (amilo key) 
sub   2048R/FFE32EF7 2013-07-18
(Отпечаток выделен)
Этот отпечаток НЕ является секретным. Передать его можно вместе с _любым_ мусором, к пример прицепив его к любой фотке, что-бы его было не так заметно, его можно преобразовать, к примеру посчитать его md5. Тут даже не нужна возможность обращения Бобом этой md5, ведь получив alice.key Боб тоже узнает отпечаток, и может самостоятельно вычислить его md5. Алисе нужно лишь отправить по какому-то другому каналу Бобу этот отпечаток в любом виде. А вот задача Кровавой ГБни существенно осложняется: ей придётся закопаться во ВЕСЬ мусор, который _может_ генерировать Алиса. И в онлайне, и даже IRL(Алиса _может_ написать fingerprint на использованной прокладке, и её выкинуть на какой-то помойке. Расковыряв прокладку Боб узнает отпечаток. Т.о. Кровавой ГБне придётся даже все алисины прокладки распотрошить)

Зная отпечаток ключа, Боб может подписать alice.key своей ЭЦП, дабы в будущем не мучаться, сверяя этот отпечаток. Вот пример подписывания ключа моего нетбука. Сейчас я нахожусь дома, за десктопом ksu, GPG ID: 3B210778. При этом ключ нетбука amilo, GPG ID: 6D300475.

$ gpg --edit-key amilo
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  2048R/6D300475  создан: 2013-07-18  годен до: неогранич   применяемость: SC  
                     доверие: полное  достоверность: полное
sub  2048R/FFE32EF7  создан: 2013-07-18  годен до: неогранич   применяемость: E   
[ полное ] (1). drBatty (amilo key) 

gpg> sign

pub  2048R/6D300475  создан: 2013-07-18  годен до: неогранич   применяемость: SC  
                     доверие: полное  достоверность: полное
 Отпечаток главного ключа: E3A9 7C06 C734 B779 92D3  69B5 3494 1316 6D30 0475

     drBatty (amilo key) 

Вы уверены, что хотите подписать этот ключ
своим ключом: "drBatty (ksu) " (3B210778)

Действительно подписать? (y/N)y

Необходим пароль для доступа к секретному ключу пользователя: "drBatty (ksu) "
2048-бит RSA ключ, ID 3B210778, создан 2011-04-02
здесь был пароль к ключу ksu
                             
gpg> quit
Сохранить изменения? (y/N)y
(выделено то, что я вбивал)

Note: здесь используются два ключа: один подписывается, а ВТОРЫМ подписывают. Второй ключ получается автоматически, это первый ключ в кольце, который имеет секретную часть. Если вам нужен другой ключ, то перед командой --sign нужно указать --default-key KID, указывающий на нужный секретный ключ.

Вот теперь проверять Боб может не только просто так. Если подпись Алисы не подписана Бобом(в смысле, публичный ключ Алисы, который есть у Боба, не подписан ключом Боба), он увидит предупреждение:


gpg: ВНИМАНИЕ: Данный ключ не заверен доверенной подписью!
gpg:          Нет указаний на то, что подпись принадлежит владельцу.
 Отпечаток главного ключа: ...

Если предупреждения не было, Боб может быть уверен, что сообщение действительно от Алисы.

 Даже если мы работаем с двумя компьютерами, всё равно в ключах просто запутаться. Нужно поставить степень доверия ключу командой trust (она вводится тоже после gpg --edit-key KID).

Укажите насколько Вы доверяете данному пользователю в
вопросах проверки достоверности ключей других пользователей.
Проверяет паспорт, сверяет отпечатки ключей и т.п.?


 1 = Не знаю или не буду отвечать
 2 = Не доверяю
 3 = Доверяю ограниченно
 4 = Полностью доверяю
 5 = Абсолютно доверяю
 m = вернуться в главное меню


 Я использую абсолютную(5) степень доверия для локальных ключей, полную(4) для своих, и ограниченную(3) для чужих ключей.

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


Редактирование и удаление ключей

У каждого ключа есть свой uid(User ID), он создаётся автоматически. Но этих uid'ов может быть и более одного. Именно на uid, а вовсе не на сам ключ, и устанавливается подпись. Можно добавлять/удалять uid командами adduid/deluid, что-бы удалить uid надо его для начала выбрать, просто набрав его номер. А затем можно удалять командой deluid.

gpg> list

pub  2048R/BEC9B8A8  создан: 2013-07-19  годен до: 2014-07-19  применяемость: SC  
                     доверие: полное  достоверность: полное
sub  2048R/EFF1C7DB  создан: 2013-07-19  годен до: 2014-07-19  применяемость: E   
[ полное ] (1). emulek2 (test) 
[ полное ] (2)  emulek (autosign) 

gpg> 1

pub  2048R/BEC9B8A8  создан: 2013-07-19  годен до: 2014-07-19  применяемость: SC  
                     доверие: полное  достоверность: полное
sub  2048R/EFF1C7DB  создан: 2013-07-19  годен до: 2014-07-19  применяемость: E   
[ полное ] (1)* emulek2 (test) 
[ полное ] (2)  emulek (autosign) 

gpg> deluid
Вы действительно хотите удалить данный User ID? (y/N)y

pub  2048R/BEC9B8A8  создан: 2013-07-19  годен до: 2014-07-19  применяемость: SC  
                     доверие: полное  достоверность: полное
sub  2048R/EFF1C7DB  создан: 2013-07-19  годен до: 2014-07-19  применяемость: E   
[ полное ] (1)  emulek (autosign) 

Как видите, выбранный uid выделяется звёздочкой (*). Именно таким образом и "редактируется" ключ, если в желаете например сменить своё имя, или почтовый адрес.

Точкой "." обозначается последний добавленный uid, используемый по умолчанию.

вторник, 9 июля 2013 г.

HOWTO: использование ЭЦП и шифрования на практике

Ну такой небольшой HOWTO, по использованию электронной подписи и шифрования.

Часть первая.

Введение

Подпись применяется повсеместно, но её применение строгим образом лимитировано государством. Она называется в оффлайне "печатью", и ставится разными юр. лицами для того, что-бы было понятно, какое лицо создало данный документ. Для физ. лиц используется обычная подпись.

Для электронных документов не используется НИЧЕГО. Таким образом, получая документ, мы даже не знаем, кто его нам прислал. Для быдла это очевидно не нужно. Шибко грамотные используют обратный адрес(IP, доменное имя сайта) для установления отправителя, но никто не задумывается о том, что подделать его не просто, а очень просто. Часто используется SSL/TLS, хотя всем широко известно, что подделка этого протокола тоже возможна (ага, центр сертификации может быть скомпрометирован). Получается, что надеяться можно исключительно на себя.

Про шифрование вообще никому похоже в Этой Стране неизвестно. Его кагбэ и нет.  Ибо «честному человеку скрывать нечего». Это ложь.

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

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

Принципы и проблемы

Достаточно просто зашифровать любой файл просто сложив его обратимым(это важно!) способом с любой известной случайной(т.е. непредсказуемой, и это тоже важно!) информацией. Доказано, что если дополнительная информация действительно непредсказуемая, то не зная её невозможно расшифровать файл. Эта дополнительная информация является ключом . Размер такого ключа должен быть равен размеру файла. Но к счастью, математики сумели придумать способ разворачивания небольшого пароля в ключ нужной длинны.

Ну следуя традиции, мы будем рассматривать передачу разведчицы Алисы резиденту Бобу. Перед передачей Алиса и Боб УЖЕ должны  знать пароль. Если его никто другой не знает, то никто не сможет прочитать переданный файл кроме Боба(Алиса тут тоже может, но это не обязательно, её же файл). Из-за того, что пароль короткий, злоумышленник может его подобрать с помощью грубой силы, используя тот факт, что о статистических данных сообщения можно заранее догадаться. Для предотвращения данной атаки, Алисе нужно рандомизировать своё сообщение так, что-бы оно было неотличимо от случайного мусора. К счастью, данная задача решена, с помощью известных всем программ сжатия -- они выкидывают лишнюю информации, оставляя только необходимую. При этом, каждый бит файла увеличивает свой "вес"(энтропию) до своего максимального значения равного ½ (как монетка, про которую мы ничего не знаем). Сообщение становится максимально непредсказуемым, что существенно затрудняет подбор.

Что-бы решить задачу аутентификации(что-бы Боб был уверен, что сообщение именно от Алисы), Алиса может отправить Бобу зашифрованную известную Бобу информацию. Этим она докажет то, что она это она.

Остаётся проблема передачи самого пароля. Данную задачу решает асимметричное шифрование. Имеются математические функции, которые можно легко(сравнительно) вычислить в прямом направлении, и намного сложнее в обратном. К примеру попробуйте разложить на простые множители 539369709830409850025883673. Мой компьютер с этим справился более чем в 400 раз дольше, чем перемножал. Числа нужно взять НАМНОГО больше, дабы разложение заняло-бы заведомо нереальное время. Такое произведение можно(и нужно) публично выкладывать где угодно, а вот сами множители нужно тщательно скрывать. Множители называются секретной частью, а произведение -- публичной(или секретным и открытым ключом соответственно).

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

Технически, асимметричное шифрование длинных файлов очень долгое, потому их шифруют неким одноразовым случайным паролем, а вот этот пароль шифруют асимметрично. Также и с подписью -- используется односторонняя функция от сообщения, называемая "хеш". Зная сообщения можно просто и быстро получить его хеш, но обратное преобразование невозможно. Также и коллизии(совпадения) хешей хоть и возможны теоретически, но вероятность их равна нулю (с практической т.з.) Алиса расшифровывает хеш своим секретным ключом, и то, что получилось, использует как ЭЦП. Любой может это число зашифровать публичным ключом Алисы, и получить хеш. Совпадение хешей гарантирует авторство Алисы. (подробнее, и не настолько упрощённо, см. в энциклопедии, здесь я попытался упростить до предела понимание, вплоть до того, что некоторые детали не совсем соответствуют действительности. Я думаю, они не слишком важны на практике)

Практика

Здесь и далее  я буду использовать стандартную программу gpg, у неё конечно есть GUI (и не один), а также она работает в любых системах. И тем не менее, я настоятельно рекомендую хотя-бы один раз сделать это в консоли. Начнём мы конечно с создания пары своих ключей:


$ gpg --gen-key 
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Выберите тип ключа:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (только для подписи)
   (4) RSA (только для подписи)
Ваш выбор (?-подробнее)? 
ключи RSA могут иметь длину от 1024 до 4096 бит.
Какой размер ключа Вам необходим? (2048) 
Запрашиваемый размер ключа 2048 бит
Выберите срок действия ключа.
         0 = без ограничения срока действительности
        = срок действительности n дней
      w = срок действительности n недель
      m = срок действительности n месяцев
      y = срок действительности n лет
Ключ действителен до? (0) 
Ключ не имеет ограничения срока действительности
Все верно? (y/N) y

Для идентификации Вашего ключа необходим User ID
Программа создаст его из Вашего имени, комментария и адреса e-mail в виде:
    "Baba Yaga (pensioner) "

Ваше настоящее имя: emulek-test
Email-адрес: emulek.bx@gmail.com
Комментарий: тест
Используется таблица символов: `utf-8'.
Вы выбрали следующий User ID:
    "emulek-test (тест) "

Сменить (N)Имя, (C)Комментарий, (E)email-адрес или (O)Принять/(Q)Выход? O
Для защиты секретного ключа необходим пароль.

Вам не нужен пароль? Это ОЧЕНЬ ПЛОХАЯ идея!
Работа будет продолжена. Вы сможете сменить пароль в любое время,
запустив данную программу с ключом "--edit-key".

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

Недостаточно случайных чисел.  Выполняйте какие-либо действия для того,
чтобы ОС могла получить больше случайных данных! (Необходимо ещё 284 байт)
.+++++
.+++++
Необходимо сгенерировать много случайных чисел. Желательно, что бы Вы
выполняли некоторые другие действия (печать на клавиатуре, движения мыши,
обращения к дискам) в процессе генерации; это даст генератору
случайных чисел возможность получить лучшую энтропию.

Недостаточно случайных чисел.  Выполняйте какие-либо действия для того,
чтобы ОС могла получить больше случайных данных! (Необходимо ещё 23 байт)
.........+++++

Недостаточно случайных чисел.  Выполняйте какие-либо действия для того,
чтобы ОС могла получить больше случайных данных! (Необходимо ещё 53 байт)
.....+++++
gpg: ключ E79DF0AF помечен как абсолютно доверяемый.
открытый и закрытый ключи созданы и подписаны.

gpg: проверка таблицы доверий
gpg: 3 ограниченных необходимо, 1 выполненных необходимо, PGP модель доверия
gpg: глубина: 0  корректных:   3  подписанных:   1  доверия: 0-, 0q, 0n, 0m, 0f, 3u
gpg: глубина: 1  корректных:   1  подписанных:   0  доверия: 0-, 0q, 0n, 0m, 1f, 0u
pub   2048R/E79DF0AF 2013-07-09
Отпечаток ключа = 15A7 34D1 5C8A 0589 A8A0  F2DB 8BB8 B503 E79D F0AF
uid                  emulek-test (тест) 
sub   2048R/B60B9CA7 2013-07-09


Принцип защиты информации базируется на том, что злоумышленник никогда не узнает секретную часть ключа, потому важно, что-бы она НЕ покидала компьютер (бекапить её можно например зашифровав весь каталог ~/.gnupg, причём это можно сделать всего один раз. Этот ключ не поменяется, если вы его конечно сами не отзовёте), ну и кроме того, даже локально секретный ключ тоже шифруется паролем. Каждый раз при расшифровке и при подписывание НЕОБХОДИМО ручками этот пароль набирать. Если на другом компьютере вам понадобится ключ -- просто сделайте ещё один. Это ведь не сложно.

Следует помнить, что ВСЯ зашифрованная информация при потере секретного ключа превратится в груду бесполезного мусора.

Публичная часть ключа

В отличие от секретной части, публичную можно и нужно оставлять где угодно в широком доступе. Если злоумышленник подменит/спрячет ВСЕ публичные ключи Алисы, то Боб тоже лишится защищённого канала, если не успеет сохранить себе копию.


Только-что сделанный ключ можно преобразовать в файл такой командой:

gpg --armor --export E79DF0AF
 
Здесь E79DF0AF это идентификатор данного ключа(впрочем, можно использовать имя, мыло, или уникальные их части). Посмотреть список ключей(кольцо) можно так:

gpg --list-key
pub   2048R/E79DF0AF 2013-07-09
uid                  emulek-test (тест) 
sub   2048R/B60B9CA7 2013-07-09
 
(список секретных ключей можно смотреть с опцией --list-secret-keys). Также ключ можно и отправить на публичный сервер ключей командой

$ gpg --send-keys E79DF0AF
gpg: отправляю ключ E79DF0AF на hkp сервер pgp.mit.edu
 
Сервер ключей задан в ~/.gnupg/gpg.conf (можно задать и в команде ключом --keyserver. Принимать ключ с сервера нужно так же, но с опцией --recv-keys. За раз можно принять несколько ключей)

Ну а уж про использование ключей я расскажу в следующей части…

Часть вторая