Key rsa: Как создать ключ для авторизации по SSH и добавить его на сервер?
Как создать ключ для авторизации по SSH и добавить его на сервер?
SSH-ключи используются для идентификации клиента при подключении к серверу по SSH-протоколу. Используйте этот способ вместо аутентификации по паролю.
SSH-ключи представляют собой пару — закрытый и открытый ключ. Закрытый должен храниться в закрытом доступе у клиента, открытый отправляется на сервер и размещается в файле authorized_keys.
Создание SSH-ключей в Linux на примере CentOS
На клиентской стороне должен быть установлен пакет ssh (openssh). На серверах FirstVDS с шаблонами по умолчанию необходимое ПО уже установлено.
yum -y install openssh-server openssh-clients
На клиентском компьютере в командной строке выполните команду генерации ключей:
ssh-keygen
Введите путь файла, в который будут помещены ключи. Каталог по умолчанию указан в скобках, в примере /домашний_каталог/.ssh/id_rsa. Если хотите оставить расположение по умолчанию, нажмите Enter.
Пароль (passphrase) используется для ограничения доступа к закрытому ключу. Пароль усложнит использование ключа третьими лицами в случае утраты. Если не хотите использовать секретную фразу, нажмите Enter без заполнения строки.
Успешно сгенерировав пару ключей, вы увидите уведомление:
Открытый ключ хранится в файле /домашний_каталог/.ssh/id_rsa.pub
, закрытый — /домашний_каталог/.ssh/id_rsa
.
Скопируйте открытый ключ на сервер в файл /домашний_каталог/.ssh/authorized_keys
. Одной строкой:
cat ~/.ssh/id_rsa.pub | ssh root@ip-адрес-сервера 'cat >> ~/.ssh/authorized_keys'
Или откройте этот файл на сервере редактором vi и вставьте строку с открытым ключом после ssh-rsa.
Ещё один способ скопировать ключ в authorized_keys — команда echo, которая помещает строку в конец файла.
echo ssh-rsa строка-публичного-ключа >> /root/. ssh/authorized_keys
Теперь можно отключить на сервере аутентификацию по паролю и использовать только SSH-ключи.
Создание SSH-ключей на Windows с PuTTYgen
Если вы используете ОС Windows, то подключиться по SSH к вашему (Linux) серверу можно через PuTTY или OpenSSH. Генерация ключей в этом случае выполняется также при помощи этих программ. В примере мы используем клиент PuTTY.
Запустите приложение PuTTYgen
, которое устанавливается вместе с PuTTY.
Выберите тип ключа SSh3-RSA и нажмите Generate
.
В процессе генерации ключей несколько раз произвольно проведите мышкой по экрану приложения для создания случайных величин, используемых для ключей.
После завершения создания ключей открытый ключ выводится на экран, закрытый хранится в памяти приложения. Чтобы сохранить эти ключи нажмите Save public key
и Save private key
. Укажите расположение файлов с ключами.
При сохранении закрытого ключа, если не заполнено поле Key passphrase
, появится запрос «Хотите ли вы сохранить ключ без секретной фразы?»
Теперь открытый ключ необходимо скопировать на сервер в файл authorized_keys. Используйте WinSCP или другой клиент для работы с файлами на удалённом Linux-сервере. Вы можете скопировать файл с открытым ключом целиком на сервер, чтоб его копия хранилась в папке .ssh
Откройте файл authorized_keys через WinSCP и файл, в который вы сохранили открытый ключ (public), на локальном компьютере текстовым редактором. Скопируйте значение ключа, сохраните и закройте файл в WinSCP.
При запуске PuTTY укажите путь к закрытому ключу на локальном компьютере. Для этого во вкладке Connections → Auth
выберите необходимый путь.
Теперь можно отключить на сервере аутентификацию по паролю и использовать только SSH-ключи.
Отключение аутентификации по паролю
Подключитесь к серверу по SSH, используя пароль, и откройте файл sshd_config для редактирования.
vi /etc/ssh/sshd_config
Убедитесь, что указан правильный путь к открытым ключам SSH, поставьте значение параметра PasswordAuthentication no
.
Перезапустите службу sshd.
service sshd restart
Подключитесь к серверу по SSH без использования пароля. Например, запустите PuTTY, проверьте, что во вкладке Connections -> Auth содержится путь к закрытому ключу и откройте подключение.
В случае успешной аутентификации по SSH-ключу вы получите доступ к командной строке сервера и сообщение вида Authenticating with public key «rsa-key-20170510», где rsa-key-20170510 — имя применённого закрытого ключа, указанное вами в файле authorized_keys.
Как сгенерировать SSH-ключ для доступа на сервер – Vscale Community
Использование SSH-ключей —простой и надёжный способ обеспечения безопасности соединения с сервером. В отличие от пароля, взломать SSH-ключ практически невозможно. Сгенерировать SSH-ключ очень просто.
Linux/MacOS
Откройте терминал и выполните команду:
$ ssh-keygen -t rsa
На консоль будет выведен следующий диалог:
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Нажмите на клавишу Enter. Далее система предложит ввести кодовую фразу для дополнительной защиты SSH-подключения:
Enter passphrase (empty for no passphrase):
Этот шаг можно пропустить. При ответе на этот и следующий вопрос просто нажмите клавишу Enter.
После этого ключ будет создан, а на консоль будет выведено следующее сообщение:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
476:b2:a8:7f:08:b4:c0:af:81:25:7e:21:48:01:0e:98 user@localhostThe key's randomart image is:
+--[ RSA 2048]----+
|+.o. |
|ooE |
|oo |
|o.+.. |
|. +.+.. S . |
|....+ o + |
| .o .... |
| . .. . |
| .... |
+-----------------+
Далее выполните в терминале команду:
$ cat ~/.ssh/id_rsa.pub
На консоль будет выведен ключ. Скопируйте его и вставьте в соответствующее поле:
Нажмите на кнопку “Добавить.”
Добавив ключ, выполните в терминале команду:
$ ssh root@[IP-адрес сервера]
После этого соединение с сервером будет установлено. Вводить пароль при этом не потребуется.
Windows
В OC Windows подключение к удаленным серверам по SSH возможно, например, с помощью клиента Putty. Скачать его можно здесь (ссылка взята с официального сайта). Putty не требует установки — чтобы начать с ним работать, достаточно просто распаковать скачанный архив.
По завершении распаковки запустите файл puttygen.exe.
Выберите тип ключа SSH-2 RSA и длину 2048 бит, а затем нажмите на кнопку Generate:
Во время генерации водите курсором в пустой области окна (это нужно для создания псевдослучайности):
Сохраните сгенерированную пару ключей на локальной машине (кнопки Save public key и Save private key).
Скопируйте сгененированный ключ и вставьте его в соответствующее поле:
tglnkSSH
взломан самый длинный ключ RSA
Программистам удалось посрамить электронщиков. Без улучшения аппаратной платформы ― фактически с опережением того самого пресловутого закона Мура ― группе исследователей по безопасности удалось поставить новый рекорд по взлому ключа RSA, который до сих пор удавалось вычислить. Подчеркнём ещё раз, рекорд поставлен не на росте голой производительности компьютерного «железа», а благодаря усовершенствованным алгоритмам для разложения большого числа на простые множители и с использованием улучшенной методики вычисления дискретного логарифма.
Многие алгоритмы шифрования с открытым ключом опираются на чрезвычайно большие числа, которые, в свою очередь, получаются путём перемножения двух или более простых чисел. Простые числа в данном случае служат секретными ключами, которые позволяют получить нужный ключ и расшифровать сообщение. Аналогичным образом используется сложность в нахождении дискретного логарифма. Разложение достаточно больших чисел на простые множители и вычисление дискретного логарифма ― это задачи, которые не подлежат взлому, а только вычислению. Все большие числа, которые можно разложить на простые в разумное время, являются скомпрометированными и для повышения защиты шифрования их разрядность необходимо увеличивать.
Новый рекорд, поставленный специалистами, позволил разложить на простые числа ключ RSA-240 длиной 240 десятичных разрядов или 795 бит. Эта же самая команда исследователей смогла вычислить дискретный логарифм такой же длины. Предыдущий рекорд разложения на простые множители был поставлен в 2010 году. Тогда удалось взломать ключ RSA с разрядностью 768 бит или с 232 десятичными разрядами. Простой дискретный логарифм для этой разрядности смогли вычислить в 2016 году. Похоже, ключ RSA 1024 бит в опасности и для надёжного шифрования данных необходимо переходить на 2048-разрядные ключи.
Важнейшим моментом исследования стал факт ускорения вычислений на той же самой аппаратной платформе, которая использовалась в 2016 году. По идее этого не должно было произойти. Растущая сложность вычисления дискретного логарифма длиной 795 бит должна была потребовать в 2,5 раза больших аппаратных ресурсов, чем для вычисления 768-битного числа. Фактически расчёты оказались в 1,33 раза быстрее, что говорит о 3-кратном превосходстве предсказания. Ускорение расчётов исследователи связали с обновлениями в программном обеспечении с открытым исходным кодом, которое опирается на вычисления с использованием метода решета числового поля (Number Field Sieving). Такой пакет как CADO-NFS содержит 300 тыс. строк кода, написанного на C и C ++.
Сумма времени для обоих новых рекордов составляет около 4000 ядро-лет. Аппаратная платформа для решения этой задачи состояла из процессоров Intel Xeon Gold 6130 с тактовой частотой 2,1 ГГц. На вычисление RSA-240 методом NFS ушло 800 ядро-лет, а матричным методом ― 100 ядро-лет. Вычисление логарифма DLP-240 методом NFS потребовало 2400 ядро-лет, а матричным ― 700 ядро-лет. Если не скупиться на ядра, взлом достаточно больших чисел в ключах RSA становится возможен в разумные сроки. Границу «безопасной» разрядности пора отодвигать.
Если вы заметили ошибку — выделите ее мышью и нажмите CTRL+ENTER.
Формирование ключа RSA для подразделения
Для установления защищенного соединения с сервером ЕГАИС необходим ключ RSA.
Cформировать ключи RSA вы можете в личном кабинете ЕГАИС. Ключ RSA записывается на тот
же аппаратный крипто-носитель, на котором находится закрытый ключ и сертификат выданные
Удостоверяющим центром ЗАО «Такснет».
Внимание: Перед получением ключей RSA проверьте в разделе «Получить ключ»
реквизиты ваших подразделений и наличие кнопки Сформировать ключ у
каждого.
Необходимо выполнение условий:
- Каждая торговая точка должна иметь свой адрес и КПП.
- Адреса двух торговых точек с одинаковым КПП должны быть идентичны до номера дома.
- Если у вас имеются подразделения с одним КПП и разными адресами, нужно обратиться в
ФНС для выдачи уникальных КПП для кажого подразделения. - Для каждого подразделения должен быть отдельный аппаратный крипто-носитель с
закрытым ключом, сертификатом и ключом RSA. Индивидуальные предприниматели работают
с одним аппаратный крипто-носителем (с одним закрытым ключом, сертификатом и одним
ключом RSA).
Ключи RSA вы можете сформировать в личном кабинете в разделе «Получить ключ»,
нажав на кнопку Сформировать ключ в строке с реквизитами торговой точки.
При генерации ключа RSA потребуется ввести PKI пароль пользователя аппаратного
крипто-носителя (для JaCarta PKI/ГОСТ по умолчанию — 11111111 (8 единиц), для
Рутокен ЭЦП 2. 0 по умолчанию 12345678)
Формирование сертификата и ключа RSA, а также запись его на аппаратный крипто-носитель
происходит автоматически. При успешном выполнении операции выводится сообщение
«Сертификат успешно записан на токен». После этого ключ можно использовать в
работе.
Внимание: Сформировать ключ RSA необходимо для каждой вашей торговой
точки, подключая к компьютеру соответствующий аппаратный крипто-носитель с закрытыми
ключами и сертификатами.
Во избежании ошибок при использовании ключей RSA, рекомендуется сделать маркировку
аппаратных крипто-носителей с указанием подразделения, к которому он принадлежит.
Использовать RSA закрытый ключ для генерации открытого ключа?
Мой ответ ниже немного длинен, но, надеюсь, он содержит некоторые детали, которые отсутствуют в предыдущих ответах. Я начну с некоторых связанных утверждений и, наконец, отвечу на первоначальный вопрос. -1) mod p
Разве закрытый ключ не должен состоять только из пары (n, d)? Почему существует 6 дополнительных компонентов? Он содержит e (открытый показатель степени), так что открытый ключ RSA может быть generated/extracted/derived из закрытого ключа private.pem RSA. Компоненты rest 5 предназначены для ускорения процесса расшифровки. Оказывается, предварительно вычисляя и сохраняя эти 5 значений, можно ускорить расшифровку RSA в 4 раза. расшифровка будет работать без этих 5 компонентов, но это можно сделать быстрее, если они у вас есть под рукой. Алгоритм ускорения основан на китайской теореме об остатках.
Да, закрытый ключ private.pem RSA на самом деле содержит все эти 8 значений; ни одно из них не генерируется на лету при выполнении предыдущей команды. Попробуйте выполнить следующие команды и сравнить выходные данные:
# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der
# Print private. der private key contents as binary stream
xxd -p private.der
# Now compare the output of the above command with output
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less
Эта структура закрытого ключа RSA рекомендуется PKCS#1 v1.5 в качестве альтернативного (второго ) представления. Стандарт PKCS#1 v2.0 полностью исключает показатели e и d из альтернативного представления. PKCS#1 v2.1 и v2.2 предлагают внести дополнительные изменения в альтернативное представление, опционально включив в него дополнительные компоненты, связанные с CRT.
Чтобы увидеть содержимое открытого ключа public.pem RSA, выполните следующее (вывод усечен до меток здесь):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Никаких сюрпризов. Это просто (n, e) пара, как и было обещано.
Теперь, наконец, ответ на первоначальный вопрос: как было показано выше, закрытый ключ RSA, сгенерированный с помощью openssl, содержит компоненты как открытого, так и закрытого ключей и некоторые другие. Когда вы generate/extract/derive открытый ключ из закрытого ключа, openssl копирует два из этих компонентов (e, n) в отдельный файл, который становится вашим открытым ключом.
Настройка ключей SSH в CentOS 7
Введение
SSH или защищенная оболочка — это шифрованный протокол, используемый для администриования и связи с серверами. При работе с сервером CentOS вы проведете больше всего времени в сеансах терминала с подключением к серверу через SSH.
В этом обучающем модуле мы расскажем о настройке ключей SSH для базового варианта установки CentOS 7. Ключи SSH обеспечивают простой и безопасный способ входа на сервер, и их использование рекомендовано для всех пользователей.
Шаг 1 — Создание пары ключей RSA
Первый шаг — создание пары ключей на клиентской системе (обычно на вашем компьютере):
По умолчанию команда ssh-keygen
создает пару 2048-битных ключей RSA. Этот уровень защиты достаточен для большинства случаев (но при желании вы можете использовать флаг -b 4096
, чтобы создать более надежный 4096-битный ключ).
Восле ввода команды вы должны увидеть следующую строку:
Output
Generating public/private rsa key pair.
Enter file in which to save the key (/your_home/.ssh/id_rsa):
Нажмите ENTER
, чтобы сохранить пару ключей в подкаталог .ssh/
домашнего каталога или укажите альтернативный путь.
Если вы ранее создали пару ключей SSH, вы можете увидеть следующую строку:
Output
/home/your_home/.ssh/id_rsa already exists.
Overwrite (y/n)?
Если вы решите перезаписать ключ на диске, вы больше не сможете выполнять аутентификацию с помощью предыдущего ключа. Будьте осторожны при выборе варианта yes, потому что этот процесс уничтожает ключи, и его нельзя отменить.
Затем вы должны увидеть следующую строку:
Output
Enter passphrase (empty for no passphrase):
Здесь вы можете ввести защищенный пароль, что настоятельно рекомендуется сделать. Пароль добавляет дополнительный уровень безопасности для защиты от входа в систему несанкционированных пользователей. Дополнительную информацию о безопасности можно найти в нашем обучающем модуле Настройка аутентификации на базе ключей SSH на сервере Linux.
Вы должны увидеть следующий результат:
Output
Your identification has been saved in /your_home/.ssh/id_rsa.
Your public key has been saved in /your_home/.ssh/id_rsa.pub.
The key fingerprint is:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
| ..o |
| E o= . |
| o. o |
| .. |
| ..S |
| o o. |
| =o.+. |
|. =++.. |
|o=++. |
+-----------------+
Теперь у вас есть открытый и закрытый ключи, которые вы можете использовать для аутентификации. Наследующем шаге вам нужно разместить открытый ключ на сервере, чтобы вы могли использовать аутентификацию на базе ключей SSH для входа в систему.
Шаг 2 — Копирование открытого ключа на сервер CentOS
Самый быстрый способ скопировать открытый ключ на хост CentOS — использовать утилиту ssh-copy-id
. Это самый простой способ, поэтому его рекомендуется использовать, если он доступен. Если на клиентском компьютере нет утилиты ssh-copy-id
, вы можете использовать один из двух альтернативных методов, описанных в этом разделе (копирование через SSH на базе пароля или копирование ключа вручную).
Копирование открытого ключа с помощью утилиты
ssh-copy-id
Утилита ssh-copy-id
по умолчанию входит в состав многих операционных систем, поэтому она может быть доступна на вашем локальном компьютере. Чтобы этот метод сработал, вы должны уже настроить защищенный паролем доступ к серверу через SSH.
Для использования этой утилиты вам нужно только указать удаленный хост, к которому вы хотите подключиться, и учетную запись пользователя, к которой у вас есть доступ через SSH с использованием пароля. Ваш открытый ключ SSH будет скопирован в эту учетную запись.
Синтаксис выглядит следующим образом:
- ssh-copy-id username@remote_host
Вы можете увидеть следующее сообщение:
Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Это означает, что ваш локальный компьютер не распознает удаленный хост. Это произойдет при первом подключении к новому хосту. Введите «yes» и нажмите ENTER
, чтобы продолжить.
Затем утилита проведет сканирование локальной учетной записи для поиска ранее созданного ключа id_rsa.pub
. Когда ключ будет найден, вам будет предложено ввести пароль учетной записи удаленного пользователя:
Output
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
username@203. 0.113.1's password:
Введите пароль (для безопасности вводимый текст не будет отображаться) и нажмите ENTER
. Утилита подключится к учетной записи на удаленном хосте, используя указанный вами пароль. Затем содержимое ключа ~/.ssh/id_rsa.pub
будет скопировано в каталог основной каталог ~/.ssh
удаленной учетной записи в файл с именем authorized_keys
.
Вы должны увидеть следующий результат:
Output
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
Теперь ваш ключ id_rsa.pub
key выгружен в удаленную учетную запись. Вы можете переходить к шагу 3.
Копирование открытого ключа с помощью SSH
Если у вас нет ssh-copy-id
, но вы активировали защищенный паролем доступ к учетной записи на вашем сервере через SSH, вы можете выгрузить ключи с помощью стандартного метода SSH.
Для этого нужно использовать команду cat
, чтобы прочитать содержимое открытого ключа SSH на локальном компьютере и передать его через соединение SSH на удаленный сервер.
Также мы можем убедиться, что каталог ~/.ssh
и имеет правильные разрешения для используемой нами учетной записи.
Мы можем вывести переданное содержимое в файл с именем authorized_keys
в этом каталоге. Мы используем символ перенаправления >>
, чтобы дополнять содержимое, а не заменять его. Это позволяет добавлять ключи без уничтожения ранее добавленных ключей.
Полная команда выглядит следующим образом:
- cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"
Вы можете увидеть следующее сообщение:
Output
The authenticity of host '203. 0.113.1 (203.0.113.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Это означает, что ваш локальный компьютер не распознает удаленный хост. Это произойдет при первом подключении к новому хосту. Введите «yes» и нажмите ENTER
, чтобы продолжить.
После этого вам нужно будет ввести пароль учетной записи удаленного пользователя:
Output
[email protected]'s password:
После ввода пароля содержимое ключа id_rsa.pub
будет скопировано в конец файла authorized_keys
учетной записи удаленного пользователя. Если операция выполнена успешно, переходите к шагу 3.
Копирование открытого ключа вручную
Если для вашего сервера не настроен защищенный паролем доступ через SSH, вам нужно будет выполнить вышеописанную процедуру вручную.
Мы вручную добавим содержимое вашего файла id_rsa. pub
в файл ~/.ssh/authorized_keys
на удаленном компьютере.
Чтобы вывести содержимое ключа id_rsa.pub
, введите на локальном компьютере следующую команду:
Вы увидите содержимое ключа, которое должно выглядеть следующим образом:
Output
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh2TmWWv11q5O3pISj2ZFl9Hgh2JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh3xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test
Получите доступ к удаленному хосту с использованием любого доступного метода.
После получения доступа к учетной записи на удаленном сервере убедитесь, что каталог ~/.ssh
существует. При необходимости эта команда создаст каталог, а если каталог уже существует, команда ничего не сделает.
Теперь вы можете создать или изменить файл authorized_keys
в этом каталоге. Вы можете добавить содержимое файла id_rsa.pub
в конец файла authorized_keys
и при необходимости создать его с помощью этой команды:
- echo public_key_string >> ~/.ssh/authorized_keys
В вышеуказанной команде замените public_key_string
результатами команды cat ~/.ssh/id_rsa.pub
, выполненной на локальном компьютере. Она должна начинаться с ssh-rsa AAAA...
.
Наконец, нужно убедиться, что каталог ~/.ssh
и файл authorized_keys
имеют соответствующий набор разрешений:
При этом будут рекурсивно удалены все разрешения «group» и «other» для каталога ~/. ssh/
.
Если вы используете учетную запись root
для настройки ключей учетной записи пользователя, важно учитывать, что каталог ~/.ssh
принадлежит пользователю, а не пользователю root
:
- chown -R sammy:sammy ~/.ssh
В этом обучающем модуле мы используем имя пользователя sammy, но вы можете заменить его в вышеприведенной команде другим используемым вами именем.
Теперь мы можем попробовать настроить аутентификацию без пароля на нашем сервере Ubuntu.
Шаг 3 — Аутентификация на сервере CentOS с помощью ключей SSH
Если вы успешно выполнили одну из вышеописанных процедур, вы сможете войти на удаленный хост без пароля учетной записи для удаленного хоста.
Базовый процесс выглядит аналогично:
Если вы подключаетесь к этому хосту первый раз (если вы используете указанный выше последний метод), вы сможете увидеть следующее:
Output
The authenticity of host '203. 0.113.1 (203.0.113.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Это означает, что ваш локальный компьютер не распознает удаленный хост. Введите «yes» и нажмите ENTER
, чтобы продолжить.
Если вы не указывали пароль для своего закрытого ключа, вы войдете в систему немедленно. Если вы указали пароль для закрытого ключа при его создании, вам будет предложено ввести пароль. После аутентификации в оболочке откроется новый сеанс с настроенной учетной записью на сервере CentOS.
Если аутентификация на базе ключа выполнена успешно, вы можете перейти к изучению дополнительных возможностей защиты системы посредством отключения аутентификации с помощью пароля.
Шаг 4 — Отключение аутентификации на сервере с помощью пароля
Если вы смогли войти в свою учетную запись с помощью SSH без пароля, это означает, что вы успешно настроили для своей учетной записи аутентификацию на базе ключей SSH. Однако механизм аутентификации по паролю все еще активен, то есть ваш сервер может подвергнуться атаке посредством простого перебора паролей.
Прежде чем выполнять описанные в настоящем разделе шаги, убедитесь, что вы настроили аутентификацию на базе ключей SSH для учетной записи root на этом сервере, или (предпочтительно) вы настроили аутентификацию на базе ключей SSH для учетной записи сервера без привилегий root и с привилегиями sudo
. На этом шаге вход в систему по паролю будет заблокирован, поэтому очень важно сохранить возможность доступа с правами администратора.
Подтвердив права администратора для удаленной учетной записи, выполните вход на удаленный сервер с помощью ключей SSH как пользователь с привилегиями root или как пользователь с привилегиями sudo
. Затем откройте файл конфигурации демона SSH:
- sudo vi /etc/ssh/sshd_config
Найдите в файле директиву PasswordAuthentication
. В начале строки этой директивы может стоять знак комментария. Нажмите i
для вставки текста, удалите знак комментария и установите значение «no». После этого вы не сможете выполнять вход в систему через SSH с использованием паролей учетной записи:
/etc/ssh/sshd_config
...
PasswordAuthentication no
...
Когда вы закончите вносить изменения, нажмите ESC
, а затем введите :wq
для записи изменений в файл и выхода из системы. Для фактического внесения этих изменений нужно перезапустить службу sshd
:
- sudo systemctl restart sshd.service
В качестве меры предосторожности откройте новое окно терминала и проверьте работу службы SSH, прежде чем закрывать этот сеанс:
После проверки работы службы SSH вы сможете безопасно закрыть все текущие сеансы сервера.
Теперь демон SSH на вашем сервере CentOS будет реагировать только на ключи SSH. Аутентификация на базе паролей успешно отключена.
Заключение
Теперь на вашем сервере должна быть настроена аутентификация на базе ключей SSH, чтобы вы могли входить в систему без пароля учетной записи.
Если вы хотите узнать больше о работе с SSH, посмотрите наше Руководство по основам SSH.
KeySizeValue | Представляет размер модуля ключа (в битах), используемого алгоритмом асимметричного шифрования.Represents the size, in bits, of the key modulus used by the asymmetric algorithm. (Унаследовано от AsymmetricAlgorithm) |
LegalKeySizesValue | Задает размеры ключа, которые поддерживаются алгоритмом асимметричного шифрования. Specifies the key sizes that are supported by the asymmetric algorithm. (Унаследовано от AsymmetricAlgorithm) |
CspKeyContainerInfo | Возвращает объект CspKeyContainerInfo, описывающий дополнительные сведения о паре ключей шифрования.Gets a CspKeyContainerInfo object that describes additional information about a cryptographic key pair. |
KeyExchangeAlgorithm | Получает имя алгоритма обмена ключами, доступного в этой реализации RSA.Gets the name of the key exchange algorithm available with this implementation of RSA. |
KeyExchangeAlgorithm | Получает имя алгоритма обмена ключами, доступного в этой реализации RSA.Gets the name of the key exchange algorithm available with this implementation of RSA. (Унаследовано от RSA) |
KeySize | Получает размер текущего ключа.Gets the size of the current key. |
LegalKeySizes | Возвращает размеры ключа, которые поддерживаются алгоритмом асимметричного шифрования.Gets the key sizes that are supported by the asymmetric algorithm. |
LegalKeySizes | Возвращает размеры ключа, которые поддерживаются алгоритмом асимметричного шифрования.Gets the key sizes that are supported by the asymmetric algorithm. (Унаследовано от AsymmetricAlgorithm) |
PersistKeyInCsp | Возвращает или задает значение, указывающее, следует ли сохранить ключ в поставщике служб шифрования (CSP). Gets or sets a value indicating whether the key should be persisted in the cryptographic service provider (CSP). |
PublicOnly | Возвращает значение, указывающее, содержит ли объект RSACryptoServiceProvider только открытый ключ.Gets a value that indicates whether the RSACryptoServiceProvider object contains only a public key. |
SignatureAlgorithm | Получает имя алгоритма подписи, доступного в этой реализации RSA.Gets the name of the signature algorithm available with this implementation of RSA. |
SignatureAlgorithm | Получает имя алгоритма подписи, доступного в этой реализации RSA.Gets the name of the signature algorithm available with this implementation of RSA. (Унаследовано от RSA) |
UseMachineKeyStore | Получает или задает значение, указывающее, следует ли сохранять ключ в хранилище ключей компьютера, а не в хранилище профилей пользователей. Gets or sets a value indicating whether the key should be persisted in the computer’s key store instead of the user profile store. |
Clear() | Освобождает все ресурсы, используемые классом AsymmetricAlgorithm.Releases all resources used by the AsymmetricAlgorithm class. (Унаследовано от AsymmetricAlgorithm) |
Decrypt(Byte[], Boolean) | Расшифровывает данные с помощью алгоритма RSA.Decrypts data with the RSA algorithm. |
Decrypt(Byte[], RSAEncryptionPadding) | Расшифровывает данные, зашифрованные с помощью алгоритма RSA с использованием указанного заполнения. Decrypts data that was previously encrypted with the RSA algorithm by using the specified padding. |
Decrypt(Byte[], RSAEncryptionPadding) | При переопределении в производном классе выполняет расшифровку входных данных с использованием указанного режима заполнения.When overridden in a derived class, decrypts the input data using the specified padding mode. (Унаследовано от RSA) |
DecryptValue(Byte[]) | Этот метод не поддерживается в текущей версии.This method is not supported in the current version. |
DecryptValue(Byte[]) | Если переопределено в производном классе, расшифровывает входные данные с помощью закрытого ключа.When overridden in a derived class, decrypts the input data using the private key. (Унаследовано от RSA) |
Dispose() | Освобождает все ресурсы, используемые текущим экземпляром класса AsymmetricAlgorithm.Releases all resources used by the current instance of the AsymmetricAlgorithm class. (Унаследовано от AsymmetricAlgorithm) |
Dispose(Boolean) | Освобождает неуправляемые ресурсы, используемые классом AsymmetricAlgorithm (при необходимости освобождает и управляемые ресурсы). Releases the unmanaged resources used by the AsymmetricAlgorithm class and optionally releases the managed resources. (Унаследовано от AsymmetricAlgorithm) |
Encrypt(Byte[], Boolean) | Зашифровывает данные с помощью алгоритма RSA.Encrypts data with the RSA algorithm. |
Encrypt(Byte[], RSAEncryptionPadding) | Шифрует данные с помощью алгоритма RSA с использованием указанного заполнения.Encrypts data with the RSA algorithm using the specified padding. |
Encrypt(Byte[], RSAEncryptionPadding) | При переопределении в производном классе выполняет шифрование входных данных с использованием указанного режима заполнения.When overridden in a derived class, encrypts the input data using the specified padding mode. (Унаследовано от RSA) |
EncryptValue(Byte[]) | Этот метод не поддерживается в текущей версии.This method is not supported in the current version. |
EncryptValue(Byte[]) | Если переопределено в производном классе, зашифровывает входные данные с помощью открытого ключа.When overridden in a derived class, encrypts the input data using the public key. (Унаследовано от RSA) |
Equals(Object) | Определяет, равен ли указанный объект текущему объекту.Determines whether the specified object is equal to the current object. (Унаследовано от Object) |
ExportCspBlob(Boolean) | Экспортирует большой двоичный объект, содержащий ключевые сведения, связанные с объектом RSACryptoServiceProvider. Exports a blob containing the key information associated with an RSACryptoServiceProvider object. |
ExportEncryptedPkcs8PrivateKey(ReadOnlySpan<Byte>, PbeParameters) | Экспортирует текущий ключ в формате PKCS #8 EncryptedPrivateKeyInfo с паролем, основанным на байтах.Exports the current key in the PKCS#8 EncryptedPrivateKeyInfo format with a byte-based password. (Унаследовано от AsymmetricAlgorithm) |
ExportEncryptedPkcs8PrivateKey(ReadOnlySpan<Char>, PbeParameters) | Экспортирует текущий ключ в формате PKCS #8 EncryptedPrivateKeyInfo с паролем, основанным на символах.Exports the current key in the PKCS#8 EncryptedPrivateKeyInfo format with a char-based password. (Унаследовано от AsymmetricAlgorithm) |
ExportParameters(Boolean) | Экспортирует объект RSAParameters.Exports the RSAParameters. |
ExportPkcs8PrivateKey() | Экспортирует текущий ключ в формате PKCS#8 PrivateKeyInfo. Exports the current key in the PKCS#8 PrivateKeyInfo format. (Унаследовано от AsymmetricAlgorithm) |
ExportRSAPrivateKey() | Экспортирует текущий ключ в формате PKCS#1 RSAPrivateKey.Exports the current key in the PKCS#1 RSAPrivateKey format. (Унаследовано от RSA) |
ExportRSAPublicKey() | Экспортирует открытую часть текущего ключа в формате PKCS#1 RSAPublicKey.Exports the public-key portion of the current key in the PKCS#1 RSAPublicKey format. (Унаследовано от RSA) |
ExportSubjectPublicKeyInfo() | Экспортирует открытую часть текущего ключа в формате X.509 SubjectPublicKeyInfo.Exports the public-key portion of the current key in the X.509 SubjectPublicKeyInfo format. (Унаследовано от AsymmetricAlgorithm) |
Finalize() | Высвобождает неуправляемые ресурсы, используемые этим экземпляром.Releases the unmanaged resources held by this instance. |
FromXmlString(String) | Инициализирует объект RSA, используя данные ключа из строки XML.Initializes an RSA object from the key information from an XML string. (Унаследовано от RSA) |
GetHashCode() | Служит хэш-функцией по умолчанию.Serves as the default hash function. (Унаследовано от Object) |
GetType() | Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance. (Унаследовано от Object) |
HashData(Byte[], Int32, Int32, HashAlgorithmName) | При переопределении в производном классе вычисляет хэш-значение указанного фрагмента массива байтов с помощью заданного хэш-алгоритма. When overridden in a derived class, computes the hash value of a specified portion of a byte array by using a specified hashing algorithm. (Унаследовано от RSA) |
HashData(Stream, HashAlgorithmName) | При переопределении в производном классе вычисляет хэш-значение указанного двоичного потока с помощью заданного алгоритма хэширования.When overridden in a derived class, computes the hash value of a specified binary stream by using a specified hashing algorithm. (Унаследовано от RSA) |
ImportCspBlob(Byte[]) | Импортирует большой двоичный объект, представляющий данные ключа RSA.Imports a blob that represents RSA key information. |
ImportEncryptedPkcs8PrivateKey(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Int32) | Импортирует пару из открытого и закрытого ключей из структуры PKCS#8 EncryptedPrivateKeyInfo после расшифровки с помощью пароля на основе байтов, заменяя ключи для этого объекта.Imports the public/private keypair from a PKCS#8 EncryptedPrivateKeyInfo structure after decrypting with a byte-based password, replacing the keys for this object. (Унаследовано от RSA) |
ImportEncryptedPkcs8PrivateKey(ReadOnlySpan<Char>, ReadOnlySpan<Byte>, Int32) | Импортирует пару из открытого и закрытого ключей из структуры PKCS#8 EncryptedPrivateKeyInfo после расшифровки с помощью пароля на основе символов, заменяя ключи для этого объекта. Imports the public/private keypair from a PKCS#8 EncryptedPrivateKeyInfo structure after decrypting with a char-based password, replacing the keys for this object. (Унаследовано от RSA) |
ImportFromEncryptedPem(ReadOnlySpan<Char>, ReadOnlySpan<Byte>) | Импортирует зашифрованный закрытый ключ в формате RFC 7468 в кодировке PEM, заменяя ключи для этого объекта.Imports an encrypted RFC 7468 PEM-encoded private key, replacing the keys for this object. (Унаследовано от RSA) |
ImportFromEncryptedPem(ReadOnlySpan<Char>, ReadOnlySpan<Char>) | Импортирует зашифрованный закрытый ключ в формате RFC 7468 в кодировке PEM, заменяя ключи для этого объекта.Imports an encrypted RFC 7468 PEM-encoded private key, replacing the keys for this object. (Унаследовано от RSA) |
ImportFromPem(ReadOnlySpan<Char>) | Импортирует зашифрованный ключ в формате RFC 7468 в кодировке PEM, заменив ключи для этого объекта. Imports an RFC 7468 PEM-encoded key, replacing the keys for this object. (Унаследовано от RSA) |
ImportParameters(RSAParameters) | Импортирует заданный RSAParameters.Imports the specified RSAParameters. |
ImportPkcs8PrivateKey(ReadOnlySpan<Byte>, Int32) | Импортирует пару из открытого и закрытого ключей из структуры PKCS#8 PrivateKeyInfo после расшифровки, заменяя ключи для этого объекта.Imports the public/private keypair from a PKCS#8 PrivateKeyInfo structure after decryption, replacing the keys for this object. (Унаследовано от RSA) |
ImportRSAPrivateKey(ReadOnlySpan<Byte>, Int32) | Импортирует пару из открытого и закрытого ключей из структуры PKCS#1 RSAPrivateKey после расшифровки, заменяя ключи для этого объекта.Imports the public/private keypair from a PKCS#1 RSAPrivateKey structure after decryption, replacing the keys for this object. (Унаследовано от RSA) |
ImportRSAPublicKey(ReadOnlySpan<Byte>, Int32) | Импортирует открытый ключ из структуры PKCS#1 RSAPublicKey после расшифровки, заменяя ключи для этого объекта.Imports the public key from a PKCS#1 RSAPublicKey structure after decryption, replacing the keys for this object. (Унаследовано от RSA) |
ImportSubjectPublicKeyInfo(ReadOnlySpan<Byte>, Int32) | Импортирует открытый ключ из структуры X.509 SubjectPublicKeyInfo после расшифровки, заменяя ключи для этого объекта.Imports the public key from an X.509 SubjectPublicKeyInfo structure after decryption, replacing the keys for this object. (Унаследовано от RSA) |
MemberwiseClone() | Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object. (Унаследовано от Object) |
SignData(Byte[], HashAlgorithmName, RSASignaturePadding) | Вычисляет хэш-значение заданного массива байтов с помощью указанного алгоритма хэширования и режима заполнения, а затем подписывает полученное хэш-значение. Computes the hash value of the specified byte array using the specified hash algorithm and padding mode, and signs the resulting hash value. (Унаследовано от RSA) |
SignData(Byte[], Int32, Int32, HashAlgorithmName, RSASignaturePadding) | Вычисляет хэш-значение части заданного массива байтов с помощью указанного алгоритма хэширования и режима заполнения, а затем подписывает полученное хэш-значение.Computes the hash value of a portion of the specified byte array using the specified hash algorithm and padding mode, and signs the resulting hash value. (Унаследовано от RSA) |
SignData(Byte[], Int32, Int32, Object) | Вычисляет хэш-значение подмножества заданного массива байтов с помощью указанного алгоритма хэширования и подписывает результирующее хэш-значение.Computes the hash value of a subset of the specified byte array using the specified hash algorithm, and signs the resulting hash value. |
SignData(Byte[], Object) | Вычисляет хэш-значение заданного массива байтов с помощью указанного алгоритма хэширования и подписывает результирующее хэш-значение.Computes the hash value of the specified byte array using the specified hash algorithm, and signs the resulting hash value. |
SignData(Stream, HashAlgorithmName, RSASignaturePadding) | Вычисляет хэш-значение заданного потока с помощью указанного алгоритма хэширования и режима заполнения, а затем подписывает полученное хэш-значение.Computes the hash value of the specified stream using the specified hash algorithm and padding mode, and signs the resulting hash value. (Унаследовано от RSA) |
SignData(Stream, Object) | Вычисляет хэш-значение заданного потока с помощью указанного алгоритма хэширования и подписывает результирующее хэш-значение.Computes the hash value of the specified input stream using the specified hash algorithm, and signs the resulting hash value. |
SignHash(Byte[], HashAlgorithmName, RSASignaturePadding) | Вычисляет подпись для указанного хэш-значения с использованием заданного заполнения.Computes the signature for the specified hash value using the specified padding. |
SignHash(Byte[], HashAlgorithmName, RSASignaturePadding) | При переопределении в производном классе вычисляет подпись для указанного хэш-значения с использованием указанного заполнения. When overridden in a derived class, computes the signature for the specified hash value using the specified padding. (Унаследовано от RSA) |
SignHash(Byte[], String) | Вычисляет подпись для указанного хэш-значения.Computes the signature for the specified hash value. |
ToString() | Возвращает строку, представляющую текущий объект.Returns a string that represents the current object. (Унаследовано от Object) |
ToXmlString(Boolean) | Создает и возвращает строку XML, содержащую ключ текущего объекта RSA.Creates and returns an XML string containing the key of the current RSA object. (Унаследовано от RSA) |
TryDecrypt(ReadOnlySpan<Byte>, Span<Byte>, RSAEncryptionPadding, Int32) | Пытается расшифровать входные данные с использованием указанного режима заполнения и записывает результат в заданный буфер. Attempts to decrypt the input data using the specified padding mode, writing the result into a provided buffer. (Унаследовано от RSA) |
TryEncrypt(ReadOnlySpan<Byte>, Span<Byte>, RSAEncryptionPadding, Int32) | Пытается зашифровать входные данные с использованием указанного режима заполнения и записать результат в заданный буфер.Attempts to encrypt the input data with a specified padding mode into a provided buffer. (Унаследовано от RSA) |
TryExportEncryptedPkcs8PrivateKey(ReadOnlySpan<Byte>, PbeParameters, Span<Byte>, Int32) | Пытается экспортировать текущий ключ в формате PKCS#8 EncryptedPrivateKeyInfo в предоставленный буфер с использованием пароля на основе байтов.Attempts to export the current key in the PKCS#8 EncryptedPrivateKeyInfo format into a provided buffer, using a byte-based password. (Унаследовано от RSA) |
TryExportEncryptedPkcs8PrivateKey(ReadOnlySpan<Char>, PbeParameters, Span<Byte>, Int32) | Пытается экспортировать текущий ключ в формате PKCS#8 EncryptedPrivateKeyInfo в предоставленный буфер с использованием пароля на основе символов. Attempts to export the current key in the PKCS#8 EncryptedPrivateKeyInfo format into a provided buffer, using a char-based password. (Унаследовано от RSA) |
TryExportPkcs8PrivateKey(Span<Byte>, Int32) | Пытается экспортировать текущий ключ в формате PKCS#8 PrivateKeyInfo в предоставленный буфер.Attempts to export the current key in the PKCS#8 PrivateKeyInfo format into a provided buffer. (Унаследовано от RSA) |
TryExportRSAPrivateKey(Span<Byte>, Int32) | Пытается экспортировать текущий ключ в формате PKCS#1 RSAPrivateKey в предоставленный буфер.Attempts to export the current key in the PKCS#1 RSAPrivateKey format into a provided buffer. (Унаследовано от RSA) |
TryExportRSAPublicKey(Span<Byte>, Int32) | Пытается экспортировать текущий ключ в формате PKCS#1 RSAPublicKey в предоставленный буфер. Attempts to export the current key in the PKCS#1 RSAPublicKey format into a provided buffer. (Унаследовано от RSA) |
TryExportSubjectPublicKeyInfo(Span<Byte>, Int32) | Пытается экспортировать текущий ключ в формате X.509 SubjectPublicKeyInfo в предоставленный буфер.Attempts to export the current key in the X.509 SubjectPublicKeyInfo format into a provided buffer. (Унаследовано от RSA) |
TryHashData(ReadOnlySpan<Byte>, Span<Byte>, HashAlgorithmName, Int32) | Пытается вычислить хэш предоставленных данных с помощью указанного алгоритма и записать результат в заданный буфер.Attempts to compute the hash of the provided data by using the specified algorithm, writing the results into a provided buffer. (Унаследовано от RSA) |
TrySignData(ReadOnlySpan<Byte>, Span<Byte>, HashAlgorithmName, RSASignaturePadding, Int32) | Пытается хэшировать предоставленные данные с помощью указанного алгоритма и подписать хэш текущим ключом, а затем записать подпись в заданный буфер. Attempts to hash the provided data with the specified algorithm and sign the hash with the current key, writing the signature into a provided buffer. (Унаследовано от RSA) |
TrySignHash(ReadOnlySpan<Byte>, Span<Byte>, HashAlgorithmName, RSASignaturePadding, Int32) | Пытается подписать хэш текущим ключом и записать подпись в заданный буфер.Attempts to sign the hash with the current key, writing the signature into a provided buffer. (Унаследовано от RSA) |
VerifyData(Byte[], Byte[], HashAlgorithmName, RSASignaturePadding) | Проверяет допустимость цифровой подписи, вычисляя хэш-значение указанных данных с помощью указанного алгоритма хэширования и заполнения, а затем сравнивая его с предоставленной подписью.Verifies that a digital signature is valid by calculating the hash value of the specified data using the specified hash algorithm and padding, and comparing it to the provided signature. (Унаследовано от RSA) |
VerifyData(Byte[], Int32, Int32, Byte[], HashAlgorithmName, RSASignaturePadding) | Проверяет допустимость цифровой подписи, вычисляя хэш-значение данных во фрагменте массива байтов с помощью указанного алгоритма хэширования и заполнения и сравнивая его с предоставленной подписью.Verifies that a digital signature is valid by calculating the hash value of the data in a portion of a byte array using the specified hash algorithm and padding, and comparing it to the provided signature. (Унаследовано от RSA) |
VerifyData(Byte[], Object, Byte[]) | Проверяет допустимость цифровой подписи путем определения хэш-значения в этой подписи с помощью предоставленного открытого ключа и его сравнения с хэш-значением предоставленных данных.Verifies that a digital signature is valid by determining the hash value in the signature using the provided public key and comparing it to the hash value of the provided data. |
VerifyData(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, HashAlgorithmName, RSASignaturePadding) | Проверяет допустимость цифровой подписи, вычисляя хэш-значение указанных данных с помощью указанного алгоритма хэширования и заполнения, а затем сравнивая его с предоставленной подписью.Verifies that a digital signature is valid by calculating the hash value of the specified data using the specified hash algorithm and padding, and comparing it to the provided signature. (Унаследовано от RSA) |
VerifyData(Stream, Byte[], HashAlgorithmName, RSASignaturePadding) | Проверяет допустимость цифровой подписи, вычисляя хэш-значение указанного потока с помощью указанного алгоритма хэширования и заполнения, а затем сравнивая его с предоставленной подписью.Verifies that a digital signature is valid by calculating the hash value of the specified stream using the specified hash algorithm and padding, and comparing it to the provided signature. (Унаследовано от RSA) |
VerifyHash(Byte[], Byte[], HashAlgorithmName, RSASignaturePadding) | Проверяет допустимость цифровой подписи путем определения хэш-значения в этой подписи с помощью указанного хэш-алгоритма и заполнения, сравнивая его с предоставленным хэш-значением.Verifies that a digital signature is valid by determining the hash value in the signature using the specified hashing algorithm and padding, and comparing it to the provided hash value. |
VerifyHash(Byte[], Byte[], HashAlgorithmName, RSASignaturePadding) | Проверяет допустимость цифровой подписи путем определения хэш-значения в этой подписи с помощью указанного хэш-алгоритма и заполнения, сравнивая его с предоставленным хэш-значением.Verifies that a digital signature is valid by determining the hash value in the signature using the specified hash algorithm and padding, and comparing it to the provided hash value. (Унаследовано от RSA) |
VerifyHash(Byte[], String, Byte[]) | Проверяет допустимость цифровой подписи путем определения хэш-значения в этой подписи с помощью предоставленного открытого ключа и его сравнения с предоставленным хэш-значением.Verifies that a digital signature is valid by determining the hash value in the signature using the provided public key and comparing it to the provided hash value. |
VerifyHash(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, HashAlgorithmName, RSASignaturePadding) | Проверяет допустимость цифровой подписи путем определения хэш-значения в этой подписи с помощью указанного хэш-алгоритма и заполнения, сравнивая его с предоставленным хэш-значением. Verifies that a digital signature is valid by determining the hash value in the signature using the specified hash algorithm and padding, and comparing it to the provided hash value. (Унаследовано от RSA) |
IDisposable.Dispose() | Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода. Описание этого члена см. в разделе Dispose().For a description of this member, see Dispose(). (Унаследовано от AsymmetricAlgorithm) |
Что такое шифрование RSA и как оно работает?
Шифрование
RSA — это система, которая решает то, что когда-то было одной из самых больших проблем в криптографии: Как вы можете отправить кому-то закодированное сообщение , не имея возможности предварительно поделиться с ними кодом?
Эта статья научит вас всему, что вам нужно знать о , как было разработано шифрование RSA , , как оно работает , , математические расчеты , , что он используется для , а также некоторые из самых больших проблем безопасности что он стоит перед . Изучение RSA даст вам некоторые фундаментальные знания, которые помогут вам понять, сколько частей нашей онлайн-жизни находится в безопасности.
Что такое шифрование RSA?
Допустим, вы хотите рассказать другу секрет. Если ты рядом с ними, можешь просто прошептать это. Если вы находитесь на противоположных концах страны, это явно не сработает. Вы можете записать его и отправить им по почте или воспользоваться телефоном, но каждый из этих каналов связи небезопасен , и любой, у кого есть достаточно сильная мотивация, может легко перехватить сообщение.
Если секрет был достаточно важным, вы не рискнули бы записать его обычным образом — шпионы или мошенник почтовый служащий могли просматривать вашу почту. Точно так же кто-то может прослушивать ваш телефон без вашего ведома и регистрировать каждый ваш звонок.
Одно из решений для предотвращения доступа злоумышленников к содержимому сообщения — это зашифровать его . Это в основном означает добавление кода к сообщению, который превращает его в беспорядок. Если ваш код достаточно сложен, то единственные люди, которые смогут получить доступ к исходному сообщению, — это те, у кого есть доступ к коду.
Если у вас была возможность поделиться кодом с другом заранее, то любой из вас может отправить зашифрованное сообщение в любое время , зная, что вы двое единственные, кто может читать содержимое сообщения. Но что, если у вас не было возможности поделиться кодом заранее?
Это одна из фундаментальных проблем криптографии, которая была решена с помощью схем шифрования с открытым ключом (также известных как асимметричное шифрование), таких как RSA .
При шифровании RSA сообщения шифруются с помощью кода, называемого открытым ключом , которым можно открыто делиться. Из-за некоторых отличных математических свойств алгоритма RSA после того, как сообщение было зашифровано открытым ключом, его можно расшифровать только другим ключом, известным как закрытый ключ . У каждого пользователя RSA есть пара ключей, состоящая из их открытого и закрытого ключей. Как следует из названия, закрытый ключ должен храниться в секрете.
Схемы шифрования с открытым ключом
отличаются от шифрования с симметричным ключом , где и в процессе шифрования, и в процессе дешифрования используется один и тот же закрытый ключ .Эти различия делают шифрование с открытым ключом, такое как RSA, полезным для связи в ситуациях, когда не было возможности безопасно распространить ключи заранее.
Алгоритмы
с симметричным ключом имеют свои собственные приложения, такие как шифрование данных для личного использования или для случаев, когда есть безопасные каналы, по которым можно передавать частные ключи.
См. Также: Криптография с открытым ключом
Где используется шифрование RSA?
Шифрование
RSA часто используется в комбинации с другими схемами шифрования или для цифровых подписей , которые могут подтвердить подлинность и целостность сообщения. Обычно оно не используется для шифрования сообщений или файлов целиком, поскольку оно менее эффективно и требует больших ресурсов, чем шифрование с симметричным ключом.
Чтобы сделать вещи более эффективными, файл обычно будет зашифрован с помощью алгоритма с симметричным ключом, а затем симметричный ключ будет зашифрован с помощью шифрования RSA. В рамках этого процесса только объект, имеющий доступ к закрытому ключу RSA, сможет расшифровать симметричный ключ.
Не имея доступа к симметричному ключу, исходный файл нельзя расшифровать .Этот метод можно использовать для защиты сообщений и файлов, не занимая слишком много времени и не потребляя слишком много вычислительных ресурсов.
Шифрование
RSA может использоваться в различных системах. Его можно реализовать в OpenSSL, wolfCrypt, cryptlib и ряде других криптографических библиотек.
Как одна из первых широко используемых схем шифрования с открытым ключом, RSA заложила основу для большей части наших безопасных коммуникаций. Он был , который традиционно использовался в TLS , а также был оригинальным алгоритмом, используемым в шифровании PGP.RSA по-прежнему используется в ряде веб-браузеров, электронной почты, VPN, чата и других каналов связи.
RSA также часто используется для создания безопасных соединений между VPN-клиентами и VPN-серверами. В таких протоколах, как OpenVPN, рукопожатия TLS могут использовать алгоритм RSA для обмена ключами и установления безопасного канала.
Основы шифрования RSA
Как мы упоминали в начале этой статьи, до шифрования с открытым ключом было сложно обеспечить безопасное взаимодействие, если не было возможности заранее безопасно обменяться ключами.Если бы не было возможности поделиться кодом заранее или безопасным каналом, через который можно было бы распространять ключи, не было бы возможности общаться без угрозы того, что враги смогут перехватить и получить доступ к содержимому сообщения.
Только в 1970-х годах ситуация действительно начала меняться. Первое крупное развитие того, что мы сейчас называем криптографией с открытым ключом, было опубликовано в начале десятилетия Джеймсом Х. Эллисом. Эллис не мог найти способ реализовать свою работу, но его коллега Клиффорд Кокс расширил ее до того, что мы теперь знаем как шифрование RSA .
Последний фрагмент головоломки — это то, что мы теперь называем обмен ключами Диффи-Хеллмана . Малкольм Дж. Уильямсон, другой сотрудник, придумал схему, которая позволяла двум сторонам использовать общий ключ шифрования, даже если канал отслеживался злоумышленниками.
Вся эта работа была проделана в британском разведывательном управлении, в Штабе правительственной связи (GCHQ), который держал открытие в секрете . Отчасти из-за технологических ограничений GCHQ не видел в то время применения криптографии с открытым ключом, поэтому разработка стояла без дела на полке и пылялась. Только в 1997 году работа была рассекречена, и первоначальные изобретатели RSA были признаны .
Несколько лет спустя аналогичные концепции начали развиваться в публичной сфере. Ральф Меркл создал раннюю форму криптографии с открытым ключом , которая повлияла на Уитфилда Диффи и Мартина Хеллмана при разработке обмена ключами Диффи-Хеллмана.
В идеях Диффи и Хеллмана отсутствовал один важный аспект, который сделал бы их работу основой криптографии с открытым ключом.Это была односторонняя функция , которую было бы трудно инвертировать . В 1977 году Рон Ривест, Ади Шамир и Леонард Адлеман , фамилии которых образуют аббревиатуру RSA, после года работы над проблемой пришли к решению.
Ученые из Массачусетского технологического института совершили прорыв после пасхальной вечеринки в 1977 году. После ночной пьянки Ривест пошел домой, но вместо того, чтобы спать, он провел весь вечер, лихорадочно записывая документ, в котором формализовалась его идея о необходимой односторонней функции .
Идея была запатентована Массачусетским технологическим институтом в 1983 году, но только на заре Интернета алгоритм RSA получил широкое распространение как важный инструмент безопасности.
Как работает шифрование RSA?
Следующее будет немного упрощением, потому что слишком многие читатели, вероятно, были травмированы учителем математики в старшей школе. Чтобы математика не выходила из-под контроля, мы введем , упрощая некоторые концепции и используя гораздо меньшие числа .На самом деле, шифрование RSA использует простые числа, которые намного больше по величине, и есть несколько других сложностей.
Есть несколько различных концепций, которые вам нужно обдумать, прежде чем мы сможем объяснить, как все это сочетается друг с другом. К ним относятся секретных функций, генерация простых чисел, общая функция Кармайкла и отдельные процессы, задействованные в вычислении открытого и закрытого ключей , используемых в процессах шифрования и дешифрования.
Функции люка
Шифрование
RSA работает при условии, что алгоритм легко вычислить в одном направлении, но почти невозможно в обратном . Например, если бы вам сказали, что 701111 — это произведение двух простых чисел, смогли бы вы выяснить, что это за два числа?
Даже имея калькулятор или компьютер, большинство из нас не будет иметь никакого представления о том, с чего начать, не говоря уже о том, чтобы найти ответ. Но если все перевернуть, становится намного проще. Что в результате:
907 х 773
Если бы вам было достаточно скучно, вы бы вытащили свой телефон или, возможно, вычислили его в своей голове, чтобы обнаружить, что ответ — ранее упомянутый 701 111.Эти 907 и 773 — простые числа, которые отвечают на наш первый вопрос, который показывает нам, что некоторые уравнения можно легко вычислить одним способом, но, по-видимому, невозможно наоборот.
Еще один интересный аспект этого уравнения заключается в том, что одно из простых чисел просто вычислить, если у вас уже есть другое, а также произведение. Если вам сказали, что 701111 — это результат умножения 907 на другое простое число, вы можете вычислить это другое простое число с помощью следующего уравнения:
701111 ÷ 907 = 773
Поскольку взаимосвязь между этими числами легко вычислить в одном направлении, но невероятно сложно в обратном, уравнение известно как функция люка . Имейте в виду, что, хотя людям сложно разобраться в приведенном выше примере, компьютеры могут выполнить операцию за незначительное время.
Из-за этого RSA использует гораздо большие числа. Размер простых чисел в реальной реализации RSA варьируется, но в 2048-битном RSA они объединяются, чтобы получить ключи длиной 617 цифр. Чтобы облегчить вам визуализацию, ключом будет число такого размера:
.
99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
Генерация простых чисел
Упомянутые выше функции лазейки составляют основу работы схем шифрования с открытым и закрытым ключом. Их свойства позволяют обмениваться открытыми ключами, не подвергая опасности сообщение или не раскрывая закрытый ключ . Они также позволяют шифровать данные одним ключом таким образом, чтобы их можно было расшифровать только другим ключом из пары.
Первым шагом шифрования сообщения с помощью RSA является создание ключей . Для этого нам нужны двух простых чисел ( p и q ) , которые выбираются с помощью теста на простоту.Тест на простоту — это алгоритм, который эффективно находит простые числа, например, тест на простоту Рабина-Миллера.
Простые числа в RSA должны быть очень большими и относительно далеко друг от друга. Маленькие или близкие друг к другу числа гораздо легче взломать. Несмотря на это, в нашем примере будут использоваться меньшие числа, чтобы упростить отслеживание и вычисления.
Предположим, что тест на простоту дает нам простые числа, которые мы использовали выше, 907 и 773. Следующий шаг — определить модуль ( n ), используя следующую формулу:
n = p x q
Где p = 907 и q = 773
Следовательно:
n = 907 x 773
n = 701111
Тотализатор Кармайкла
Когда у нас есть n , мы используем общую функцию Кармайкла :
λ ( n ) = lcm ( p — 1, q — 1)
Если вы давно не читали учебники по математике, то приведенное выше может показаться немного устрашающим.Вы можете пропустить эту часть и просто поверить в то, что математика работает, в противном случае оставайтесь с нами для еще нескольких расчетов. Все будет объяснено максимально подробно, чтобы помочь вам разобраться в основах.
Для тех, кто не в курсе, λ (n) представляет тотентиент Кармайкла для n , а lcm означает наименьшее общее кратное , которое является наименьшим числом, которое одновременно p и q можно разделить на. Есть несколько разных способов выяснить это, но самый простой — довериться онлайн-калькулятору, который сделает уравнение за вас. Итак, давайте представим наши числа в уравнении:
λ ( 701,111 ) = л · см ( 907 — 1, 773 — 1)
λ ( 701,111 ) = л · см ( 906, 772 )
Используя калькулятор, указанный выше, мы получаем:
λ ( 701,111 ) = 349,716
Генерация открытого ключа
Теперь, когда у нас есть число Кармайкла наших простых чисел, настало время вычислить наш открытый ключ. Согласно RSA, открытых ключей состоят из простого числа e , а также n . Число e может быть любым от 1 до значения λ ( n ), которое в нашем примере равно 349 716.
Поскольку открытый ключ используется открыто, не так важно, чтобы e было случайным числом. На практике e обычно устанавливается на 65 537 , потому что, когда случайным образом выбираются гораздо большие числа, это делает шифрование гораздо менее эффективным.В сегодняшнем примере мы будем держать числа небольшими, чтобы вычисления были эффективными. Скажем:
e = 11
Наши окончательные зашифрованные данные называются зашифрованным текстом ( c ). Мы получаем его из нашего открытого текстового сообщения ( m ), применяя открытый ключ по следующей формуле:
c = м e мод n
У нас уже есть e , и мы также знаем n .Единственное, что нам нужно объяснить, это mod . Это немного выходит за рамки этой статьи, но это относится к операции по модулю , что по сути означает остаток, оставшийся при делении одной стороны на другую. Например:
10 мод 3 = 1
Это потому, что 3 трижды переходит в 10, а остаток равен 1.
Вернемся к нашему уравнению. Для простоты предположим, что сообщение ( m ), которое мы хотим зашифровать и сохранить в секрете, представляет собой всего лишь одно число, 4 .Подключим все:
c = м e мод n
c = 4 11 мод 701111
c = 4,194,304 мод 701,111
Опять же, чтобы упростить операцию по модулю , мы будем использовать онлайн-калькулятор, но вы можете выяснить это сами. Введя 4 194 304 в онлайн-калькулятор, мы получим:
c = 688,749
Следовательно, когда мы используем RSA для шифрования нашего сообщения, 4 , с нашим открытым ключом, он дает нам зашифрованный текст 688 749 .Предыдущие шаги могут показаться слишком сложными с математикой, но важно повторить то, что на самом деле произошло.
У нас было сообщение о 4 , которое мы хотели сохранить в секрете. Мы применили к нему открытый ключ, который дал нам зашифрованный результат : 688 749 . Теперь, когда он зашифрован, мы можем безопасно отправить число 688 749 владельцу пары ключей . Они — единственный человек, который сможет расшифровать его своим закрытым ключом. Когда они его расшифруют, они увидят сообщение, которое мы действительно отправляли, 4 .
Создание закрытого ключа
При шифровании RSA, как только данные или сообщение были преобразованы в зашифрованный текст с открытым ключом, они могут быть дешифрованы только закрытым ключом из той же пары ключей. Закрытые ключи состоят из d и n . Мы уже знаем n, , и следующее уравнение используется для нахождения d :
d = 1/ e mod λ ( n )
В разделе Генерация открытого ключа выше мы уже решили, что в нашем примере e будет равно 11.Точно так же мы знаем, что λ ( n ) равняется 349 716 из нашей более ранней работы по тотент-функции Кармайкла . Все становится немного сложнее, когда мы сталкиваемся с этим разделом формулы:
1/ e мод
Это уравнение может выглядеть так, как будто оно просит вас разделить 1 на 11, но это не так. Вместо этого это просто символизирует то, что нам нужно вычислить модульное обратное значение для e (которое в данном случае равно 11) и λ ( n ) (которое в данном случае равно 349 716).
По сути, это означает, что вместо выполнения стандартной операции по модулю, мы будем использовать обратное . Обычно это можно найти с помощью расширенного алгоритма Евклида, но это немного выходит за рамки данной статьи, поэтому мы просто обманем и воспользуемся онлайн-калькулятором. Теперь, когда мы понимаем все, что происходит, давайте подставим полученную информацию в формулу:
d = 1/ 11 мод 349,716
Чтобы выполнить эту операцию, просто введите 11 (или любое значение, которое вы можете иметь для e , если вы пытаетесь это сделать в своем собственном примере), где указано Integer и 349,716 (или любое значение, которое вы можете иметь для λ ( n ), если вы пытаетесь это сделать на своем собственном примере), где в онлайн-калькуляторе, ссылка на который указана выше, указано Modulo . Если вы все сделали правильно, вы должны получить результат где:
д = 254, 339
Теперь, когда у нас есть значение d , мы можем расшифровать сообщения, зашифрованные с помощью нашего открытого ключа, используя следующую формулу:
м = c d мод n
Теперь мы можем вернуться к зашифрованному тексту, который мы зашифровали в разделе Создание закрытого ключа . Когда мы зашифровали сообщение с помощью открытого ключа, он дал нам значение для c из 688 749 .Из вышеизложенного мы знаем, что d равно 254 339 . Мы также знаем, что n равно 701111 . Это дает нам:
м = 688,749 254,339 мод 701111.
Как вы могли заметить, для большинства обычных калькуляторов попытка довести число до 254,339 степени может оказаться непосильной задачей. Вместо этого мы будем использовать онлайн-калькулятор расшифровки RSA. Если вы хотите использовать другой метод, вы должны применить полномочия, как обычно, и выполнить операцию модуля так же, как мы делали в разделе Создание открытого ключа .
В указанном выше калькуляторе введите 701111, где указано Модуль поставки: N , 254,399, где указано Ключ дешифрования: D , и 688,749, где указано Сообщение зашифрованного текста в числовой форме , как показано ниже:
После того, как вы ввели данные, нажмите Расшифровать , чтобы ввести числа в формулу дешифрования, указанную выше. Это даст вам исходное сообщение в поле ниже. Если вы все сделали правильно, вы должны получить ответ 4 , это было исходное сообщение, которое мы зашифровали с помощью нашего открытого ключа.
Как работает шифрование RSA на практике
Приведенные выше разделы должны дать вам разумное представление о том, как работает математика, лежащая в основе шифрования с открытым ключом. Это может немного сбивать с толку, но даже те, кто не разбирался в тонкостях уравнений, надеюсь, могут унести некоторую важную информацию о процессе.
В шагах, перечисленных выше, мы показали, как два объекта могут безопасно взаимодействовать без предварительного совместного использования кода.Во-первых, каждому из них необходимо настроить свои собственные пары ключей и совместно использовать открытый ключ друг с другом . Обе стороны должны хранить свои закрытые ключи в секрете, чтобы их связь оставалась безопасной.
Когда отправитель получает открытый ключ получателя, он может использовать его для шифрования данных, которые они хотят сохранить в безопасности. После того, как он был зашифрован открытым ключом, его можно расшифровать только закрытым ключом из той же пары ключей . Даже тот же открытый ключ нельзя использовать для расшифровки данных.Это связано с упомянутыми выше свойствами люка с функциями .
Когда получатель получает зашифрованное сообщение, он использует свой закрытый ключ для доступа к данным. Если получатель хочет вернуть сообщения безопасным способом, , он может затем зашифровать свое сообщение открытым ключом стороны, с которой он общается . Опять же, после того, как он был зашифрован открытым ключом, единственный способ получить доступ к информации — через соответствующий закрытый ключ.
Таким образом, шифрование RSA может использоваться ранее неизвестными сторонами для безопасной передачи данных между собой. Значительная часть каналов связи, которые мы используем в нашей онлайн-жизни, были построены на этом фундаменте.
Как более сложные сообщения шифруются с помощью RSA?
В нашем примере мы сильно упростили ситуацию, чтобы облегчить понимание, поэтому мы зашифровали только сообщение «4». Возможность шифрования числа 4 не кажется особенно полезной, поэтому вам может быть интересно, , как можно зашифровать более сложный набор данных , например, симметричный ключ (который является наиболее распространенным использованием RSA) или даже сообщение.
Некоторые люди могут быть озадачены тем, как ключ типа «n38cb29fkbjh238g7fqijnf3kaj84f8b9f…» или сообщение типа «купи мне бутерброд» можно зашифровать с помощью такого алгоритма, как RSA, который работает с числами, а не с буквами. Реальность такова, что вся информация, обрабатываемая нашими компьютерами, хранится в двоичном формате (единицы и нули), и мы используем стандарты кодирования, такие как ASCII или Unicode , чтобы представить их понятным людям способом (буквы).
Это означает, что ключей типа «n38cb29fkbjh238g7fqijnf3kaj84f8b9f…» и сообщения типа «купи мне бутерброд» уже существуют как числа , которые можно легко вычислить в алгоритме RSA.Числа, которыми они представлены, намного больше, и нам труднее управлять, поэтому мы предпочитаем иметь дело с буквенно-цифровыми символами, а не с беспорядком двоичных символов.
Если вы хотите зашифровать более длинный сеансовый ключ или более сложное сообщение с помощью RSA, просто потребуется гораздо большее число .
Набивка
Когда RSA реализован, он использует что-то, называемое заполнением , чтобы помочь предотвратить ряд атак . Чтобы объяснить, как это работает, мы начнем с примера.Допустим, вы отправляли закодированное сообщение другу:
Уважаемая Карен,
Надеюсь, у вас все хорошо. Мы все еще завтракаем?
С уважением,
Джеймс
Допустим, вы закодировали сообщение простым способом, заменив каждую букву на ту, которая следует за ней в алфавите . Это изменит сообщение на:
Efbs Lbsfo,
Дж ipqf zpv bsf xfmm.Bsf xf tujmm ibwjoh ejoofs upnpsspx?
Zpvst tjodfsfmz,
Кбнфут
Если ваши враги перехватили это письмо, есть трюк, который они могут использовать, чтобы попытаться взломать код. Они могут посмотреть на формат вашего письма и попытаться угадать, о чем может быть сказано в сообщении. Они знают, что люди обычно начинают свои письма со слов «Привет», «Привет», «Дорогой» или ряда других условных обозначений.
Если бы они попытались применить «Привет» или «Привет» в качестве первого слова, они увидели бы, что оно не умещается в количестве символов. Затем они могли попробовать «Дорогой». Это подходит, но это не обязательно что-то значит. Злоумышленники просто попробуют и посмотрят, куда это их приведет. Таким образом, они заменили буквы «е», «f», «b» и «s» на «d», «e», «a» и «r» соответственно. Это даст им:
Уважаемый Ласео,
J ipqe zpv — xemm. Являются ли xe tujmm iawjoh djooes upnpsspx?
Zpvrt tjoderemz,
Канет
Это все еще выглядит довольно запутанным, поэтому злоумышленники могут попытаться взглянуть на некоторые другие условные обозначения, например , например, как мы завершаем наши письма .Люди часто добавляют в конце «От кого» или «С уважением», но ни один из них не подходит к формату. Вместо этого злоумышленники могут попробовать «Искренне Ваш» и заменить другие буквы, чтобы увидеть, где они находятся. Изменив «z», «p», «v», «t», «j», «o», «d» и «m» на «y», «o», «u», «s», « i »,« n »,« c »и« l »соответственно, они получат:
Уважаемый Lasen,
Я ioqe ты xell. Являются ли xe tuill iawinh dinnes uonossox?
С уважением,
Канет
После этой модификации похоже, что злоумышленники уже куда-то попадают.Они нашли слова «я», «ты» и «есть» в дополнение к словам, из которых были сделаны их первоначальные предположения.
Видя, что слова расположены в правильном грамматическом порядке, злоумышленники могут быть уверены, что они движутся в правильном направлении. К настоящему времени они, вероятно, также поняли, что код включает в себя замену каждой буквы на ту, которая следует за ней в алфавите. Как только они это поймут, можно будет легко перевести остальное и прочитать исходное сообщение .
Вышеупомянутый пример был простым кодом, но, как вы можете видеть, структура сообщения может дать злоумышленникам ключи к разгадке его содержимого . Конечно, было сложно понять суть сообщения, исходя только из его структуры, и потребовались некоторые обоснованные догадки, но вы должны помнить, что компьютеры справляются с этим намного лучше, чем мы. Это означает, что их можно использовать для определения гораздо более сложных кодов за гораздо более короткое время , основываясь на подсказках, которые исходят из структуры и других элементов.
Если структура может привести к взлому кода и раскрытию содержимого сообщения, то нам нужен способ скрыть структуру, чтобы обеспечить безопасность сообщения. Это подводит нас к padding .
Когда сообщение дополняется, добавляется случайных данных, чтобы скрыть исходные подсказки форматирования, которые могут привести к взлому зашифрованного сообщения . С RSA все немного сложнее, потому что зашифрованный ключ не имеет очевидного форматирования письма, которое помогло нам дать подсказку в нашем примере выше.
Несмотря на это, злоумышленники могут использовать ряд атак для использования математических свойств кода и взлома зашифрованных данных. Из-за этой угрозы реализации RSA используют схемы заполнения, такие как OAEP, для встраивания дополнительных данных в сообщение . Добавление этого заполнения перед шифрованием сообщения делает RSA намного более безопасным.
Подписание сообщений
RSA можно использовать не только для шифрования данных. Его свойства также делают его полезной системой для , подтверждающей, что сообщение было отправлено субъектом, который утверждает, что он его отправил, а также доказательства того, что сообщение не было изменено или подделано с .
Когда кто-то хочет доказать подлинность своего сообщения, он может вычислить хэш (функция, которая принимает данные произвольного размера и превращает их в значение фиксированной длины) открытого текста, а затем подписать его своим закрытым ключом. . Они подписывают хэш, применяя ту же формулу, которая используется при расшифровке ( m = c d mod n ). После того, как сообщение было подписано, они отправляют эту цифровую подпись получателю вместе с сообщением.
Если получатель получает сообщение с цифровой подписью, он может использовать подпись , чтобы проверить, было ли сообщение аутентично подписано закрытым ключом лица, которое утверждает, что отправило его . Они также могут видеть, было ли сообщение изменено злоумышленниками после его отправки.
Чтобы проверить цифровую подпись, получатель сначала использует ту же хеш-функцию, чтобы найти хэш-значение полученного сообщения. Затем получатель применяет открытый ключ отправителя к цифровой подписи, , используя формулу шифрования ( c = m e mod n), , чтобы получить хэш цифровой подписи.
С помощью , сравнивая хэш сообщения, которое было получено, с хешем из зашифрованной цифровой подписи , получатель может определить, является ли сообщение подлинным. Если два значения совпадают, сообщение не было изменено с тех пор, как оно было подписано исходным отправителем. Если бы сообщение было изменено хотя бы одним символом, хеш-значение было бы совершенно другим.
RSA Безопасность и атаки
Как и большинство криптосистем, безопасность RSA зависит от того, как он реализован и используется.Одним из важных факторов является размер ключа. Чем больше число битов в ключе (по сути, какова длина ключа), тем труднее взломать атаки , такие как перебор и факторинг.
Поскольку алгоритмы с асимметричным ключом, такие как RSA, могут быть нарушены целочисленной факторизацией, в то время как алгоритмы с симметричным ключом, такие как AES, не могут, ключи RSA должны быть намного длиннее для достижения того же уровня безопасности.
В настоящее время наибольший размер ключа , который был разложен на множители, составляет 768 бит .Это было сделано командой ученых в течение двух лет с использованием сотен машин.
Поскольку факторинг был завершен к концу 2009 года, и вычислительная мощность с тех пор значительно выросла, можно предположить, что попытка аналогичной интенсивности теперь может разложить на множитель гораздо больший ключ RSA .
Несмотря на это, время и ресурсы, необходимые для такого рода атак, делают их недоступными для большинства хакеров и доступными для национальных государств. Оптимальная длина ключа будет зависеть от вашей индивидуальной модели угрозы.Национальный институт стандартов и технологий рекомендует минимальный размер ключа 2048-бит , но 4096-битные ключи также используются в некоторых ситуациях, когда уровень угрозы выше.
Факторинг — лишь один из способов взлома RSA. Ряд других атак может взломать шифрование с меньшим объемом ресурсов, но они зависят от реализации и других факторов, не обязательно самого RSA. Некоторые из них включают:
Действительно ли простые числа случайны?
Некоторые реализации RSA используют слабые генераторы случайных чисел для получения простых чисел.Если эти числа не достаточно случайны, злоумышленникам будет намного проще их разложить и взломать шифрование. Этой проблемы можно избежать, используя криптографически безопасный генератор псевдослучайных чисел .
Некачественная генерация ключей
Ключи
RSA должны соответствовать определенным параметрам, чтобы быть безопасными. Если простые числа p и q расположены слишком близко друг к другу, ключ может быть легко обнаружен.Аналогично, число d , составляющее часть закрытого ключа, не может быть слишком маленьким . Низкое значение упрощает решение. Важно, чтобы эти номера имели достаточную длину, чтобы ваш ключ был в безопасности.
Атаки по побочному каналу
Это тип атаки, который не нарушает RSA напрямую, а вместо этого использует информацию о его реализации, чтобы дать злоумышленникам подсказки о процессе шифрования. Эти атаки могут включать в себя такие вещи, как , анализирующий количество используемой мощности, или анализ предсказания ветвления , который использует измерения времени выполнения для обнаружения закрытого ключа.
Другой тип атаки по побочному каналу известен как временная атака. Если у злоумышленника есть возможность измерить время дешифрования на компьютере своей цели для ряда различных зашифрованных сообщений, эта информация может позволить злоумышленнику установить закрытый ключ цели.
Большинство реализаций RSA избегают этой атаки, добавляя одноразовое значение в процессе шифрования, которое устраняет эту корреляцию. Этот процесс называется криптографическим ослеплением .
Безопасно ли в будущем шифрование RSA?
Хорошая новость заключается в том, что RSA считается безопасным в использовании, несмотря на эти возможные атаки. Предостережение заключается в том, что необходимо правильно реализовать и использовать ключ, который соответствует правильным параметрам. Как мы только что обсуждали, реализации, которые не используют заполнение, используют простые числа недостаточного размера или имеют другие уязвимости, не могут считаться безопасными.
Если вы хотите использовать шифрование RSA, убедитесь, что вы используете ключ не менее 1024 битов .Тем, у кого есть более высокие модели угроз, следует придерживаться ключей длиной 2048 или 4096 бит, если они хотят уверенно использовать RSA. Если вы осознаёте слабые стороны RSA и правильно его используете, вы должны чувствовать себя в безопасности при использовании RSA для совместного использования ключей и других подобных задач, требующих шифрования с открытым ключом.
См. Также: Объяснение распространенных типов шифрования
Как использовать ssh-keygen для генерации нового ключа SSH
Эта страница посвящена OpenSSH-версии ssh-keygen
.Информацию о Tectia SSH см. Здесь. Если вы хотите сгенерировать ключи для PuTTY, см. PuTTYgen в Windows или PuTTYgen в Linux.
Что такое
ssh-keygen
?
Ssh-keygen
— это инструмент для создания новых пар ключей аутентификации для SSH. Такие пары ключей используются для автоматизации входа в систему, единой регистрации и для аутентификации хостов.
Ключи SSH и аутентификация с открытым ключом
Протокол SSH использует криптографию с открытым ключом для аутентификации хостов и пользователей.Ключи аутентификации, называемые ключами SSH, создаются с помощью программы keygen
.
SSH представил аутентификацию с открытым ключом как более безопасную альтернативу старой аутентификации . rhosts
. Это улучшило безопасность, избавив от необходимости хранить пароль в файлах, и устранило возможность кражи пароля пользователя взломанным сервером.
Однако ключи SSH являются учетными данными аутентификации, как и пароли. Таким образом, ими нужно управлять аналогично именам пользователей и паролям.У них должен быть надлежащий процесс завершения, чтобы ключи удалялись, когда они больше не нужны.
Создание пары ключей SSH для аутентификации пользователя
Самый простой способ создать пару ключей — запустить ssh-keygen
без аргументов. В этом случае он запросит файл, в котором будут храниться ключи. Вот пример:
klar (11:39) ~> ssh-keygen
Создание пары ключей открытого и закрытого типа RSA.
Введите файл, в котором нужно сохранить ключ (/home/ylo/.ssh/id_rsa):
Введите кодовую фразу (пусто, если кодовая фраза отсутствует):
Введите ту же парольную фразу еще раз:
Ваш идентификатор был сохранен в / home / ylo /. ssh / id_rsa.
Ваш открытый ключ был сохранен в /home/ylo/.ssh/id_rsa.pub.
Ключевой отпечаток пальца:
SHA256: Up6KjbnEV4Hgfo75YM393QdQsK3Z0aTNBz0DoirrW + c ylo @ klar
Изображение ключа randomart:
+ --- [RSA 2048] ---- +
| . ..oo .. |
| . . . . .o.X. |
| . . о. .. + B |
| . o.o. + .. |
| ..o.S o .. |
| . % o =. |
| @ .B .... |
| о. =. о. . . . |
| .oo E.. .. |
+ ---- [SHA256] ----- +
klar (11:40) ~>
Сначала программа спросила, где сохранить файл. Ключи SSH для аутентификации пользователя обычно хранятся в пользовательском .ssh
в домашнем каталоге. Однако в корпоративных средах расположение часто бывает другим. Имя файла ключей по умолчанию зависит от алгоритма, в данном случае id_rsa
при использовании алгоритма RSA по умолчанию. Это также может быть, например, id_dsa
или id_ecdsa
.
Затем он просит ввести кодовую фразу. Парольная фраза используется для шифрования ключа, поэтому ее нельзя использовать, даже если кто-то получит файл закрытого ключа. Кодовая фраза должна быть криптографически надежной.Наш онлайн-генератор случайных паролей — один из возможных инструментов для создания надежных парольных фраз.
Выбор алгоритма и размера ключа
SSH поддерживает несколько алгоритмов открытого ключа для ключей аутентификации. К ним относятся:
rsa
— старый алгоритм, основанный на сложности факторизации больших чисел. Для RSA рекомендуется размер ключа не менее 2048 бит; 4096 бит лучше. RSA стареет, и в сфере факторинга достигнуты значительные успехи.Может быть целесообразно выбрать другой алгоритм. Вполне возможно, что в обозримом будущем алгоритм RSA станет практически взломанным. Все клиенты SSH поддерживают этот алгоритм.dsa
— старый алгоритм цифровой подписи правительства США. Он основан на сложности вычисления дискретных логарифмов. Обычно с ним используется размер ключа 1024. DSA в исходном виде больше не рекомендуется.ecdsa
— новый алгоритм цифровой подписи, стандартизированный правительством США, с использованием эллиптических кривых. Вероятно, это хороший алгоритм для текущих приложений. Поддерживаются только три размера ключа: 256, 384 и 521 (sic!) Бит. Мы бы рекомендовали всегда использовать его с 521 битом, поскольку ключи все еще маленькие и, вероятно, более безопасны, чем меньшие ключи (хотя они также должны быть безопасными). Большинство клиентов SSH теперь поддерживают этот алгоритм.ed25519
— это новый алгоритм, добавленный в OpenSSH. Поддержка его в клиентах еще не универсальна. Таким образом, его использование в приложениях общего назначения еще не рекомендуется.
Алгоритм выбирается с помощью параметра -t
, а размер ключа — с помощью параметра -b
. Следующие команды иллюстрируют:
ssh-keygen -t rsa -b 4096
ssh-keygen -t dsa
ssh-keygen -t ecdsa -b 521
ssh-keygen -t ed25519
Указание имени файла
Обычно инструмент запрашивает файл, в котором следует сохранить ключ. Однако его также можно указать в командной строке с помощью параметра -f <имя файла>
.
ssh-keygen -f ~ / tatu-key-ecdsa -t ecdsa -b 521
Копирование открытого ключа на сервер
Чтобы использовать аутентификацию с открытым ключом, открытый ключ должен быть скопирован на сервер и установлен в файле authorized_keys. Это удобно сделать с помощью инструмента ssh-copy-id. Примерно так:
ssh-copy-id -i ~ / .ssh / tatu-key-ecdsa user @ host
После того, как открытый ключ будет настроен на сервере, сервер разрешит любому подключающемуся пользователю, имеющему закрытый ключ для входа в систему.В процессе входа в систему клиент доказывает, что владеет секретным ключом, подписывая обмен ключами цифровой подписью.
Добавление ключа к агенту SSH
ssh-agent
— это программа, которая может хранить закрытый ключ пользователя, поэтому парольную фразу закрытого ключа нужно указать только один раз. Соединение с агентом также может быть перенаправлено при входе на сервер, что позволяет командам SSH на сервере использовать агент, работающий на рабочем столе пользователя.
Дополнительную информацию об использовании и настройке агента SSH см. На странице ssh-agent.
Создание ключей хоста
Инструмент также используется для создания ключей аутентификации хоста. Ключи хоста хранятся в каталоге / etc / ssh /
.
Ключи хоста — это обычные пары ключей SSH. У каждого хоста может быть один ключ хоста для каждого алгоритма. Ключи хоста почти всегда хранятся в следующих файлах:
/ etc / ssh / ssh_host_dsa_key
/ и т. д. / ssh / ssh_host_ecdsa_key
/ и т. д. / ssh / ssh_host_ed25519_key
/ etc / ssh / ssh_host_rsa_key
Ключи хоста обычно автоматически генерируются при установке сервера SSH.Их можно восстановить в любой момент. Однако при изменении ключей хоста клиенты могут предупредить об изменении ключей. Об изменении ключей также сообщается, когда кто-то пытается выполнить атаку «злоумышленник в середине». Таким образом, не рекомендуется приучать пользователей слепо принимать их. Таким образом, изменение ключей лучше всего выполнять с помощью инструмента управления ключами SSH, который также меняет их на клиентах, или с помощью сертификатов.
Использование сертификатов X.509 для аутентификации хоста
OpenSSH не поддерживает X.509 сертификатов. Tectia SSH их поддерживает. Сертификаты X.509 широко используются в более крупных организациях, чтобы упростить изменение ключей хоста на периодической основе, избегая при этом ненужных предупреждений от клиентов. Они также позволяют использовать строгую проверку ключа хоста, что означает, что клиенты сразу откажутся от соединения, если ключ хоста изменился.
Использование собственных сертификатов OpenSSH
OpenSSH имеет собственный собственный формат сертификата, который можно использовать для подписи сертификатов хоста или сертификатов пользователей.Что касается аутентификации пользователей, отсутствие высоконадежных центров сертификации в сочетании с невозможностью проверить, кто может получить доступ к серверу путем проверки сервера, заставляет нас не рекомендовать использовать сертификаты OpenSSH для аутентификации пользователей.
Однако сертификаты OpenSSH могут быть очень полезны для аутентификации сервера и могут дать те же преимущества, что и стандартные сертификаты X.509. Однако им нужна собственная инфраструктура для выдачи сертификатов. См. Дополнительную информацию об аутентификации сертификата.
Управление ключами требует внимания
Создать и настроить новые ключи SSH легко. В конфигурации по умолчанию OpenSSH позволяет любому пользователю настраивать новые ключи. Ключи представляют собой постоянные учетные данные для доступа, которые остаются действительными даже после удаления учетной записи пользователя.
В организациях с более чем несколькими десятками пользователей ключи SSH легко накапливаются на серверах и учетных записях служб на протяжении многих лет. Мы видели предприятия с несколькими миллионами ключей, предоставляющих доступ к своим рабочим серверам.Чтобы получить доступ, достаточно одного ключа, который был утек, украден или неправильно настроен.
В любой крупной организации использование решений для управления ключами SSH практически необходимо. Ключи SSH также следует переместить в места, принадлежащие root, с надлежащими процессами подготовки и завершения. Дополнительные сведения см. В разделе, как управлять ключами SSH. Широко используемым инструментом управления ключами SSH для OpenSSH является Universal SSH Key Manager.
Практически все нормативные базы кибербезопасности требуют управления тем, кто и к чему имеет доступ.Ключи SSH предоставляют доступ и подпадают под это требование. Таким образом, организации в соответствии с мандатами должны внедрить надлежащие процессы управления ключами. NIST IR 7966 — хорошая отправная точка.
Убедитесь, что случайности достаточно
При генерации ключей SSH важно убедиться, что в системе достаточно непредсказуемой энтропии. Были случаи, когда тысячи устройств в Интернете использовали один и тот же ключ хоста, когда они были неправильно настроены для генерации ключа без должной случайности.
Системы общего назначения
На компьютерах общего назначения случайность генерации ключей SSH обычно не является проблемой. Это может быть проблемой при первоначальной установке SSH-сервера и генерации ключей хоста, и только людям, создающим новые дистрибутивы Linux или установочные пакеты SSH, обычно нужно беспокоиться об этом.
Наша рекомендация — собирать случайность в течение всей установки операционной системы и сохранять эту случайность в случайном начальном файле.Затем загрузите систему, соберите еще немного случайности во время загрузки, смешайте сохраненную случайность из исходного файла и только затем сгенерируйте ключи хоста. Этот
максимизирует использование доступной случайности. И убедитесь, что файл случайного начального числа периодически обновляется, в частности, убедитесь, что он обновляется после генерации ключей хоста SSH.
Многие современные процессоры общего назначения также имеют аппаратные генераторы случайных чисел. Это очень помогает с этой проблемой. Лучшая практика — собирать некоторую энтропию другими способами, по-прежнему хранить ее в случайном начальном файле и смешивать некоторую энтропию из аппаратного генератора случайных чисел.Таким образом, даже если один из них каким-то образом скомпрометирован, другой источник случайности должен сохранить ключи в безопасности.
Встроенные устройства и Интернет вещей
Доступная энтропия может быть реальной проблемой для небольших устройств IoT, которые не имеют большой активности в системе. У них может просто не быть механической случайности из-за таймингов механического движения дисковода, прерываний, вызываемых пользователем, или сетевого трафика. Более того, встроенные устройства часто работают на процессорах начального уровня, которые могут не иметь аппаратного генератора случайных чисел.
Наличие энтропии также критически важно, когда такие устройства генерируют ключи для HTTPS.
Мы рекомендуем такие устройства иметь аппаратный генератор случайных чисел. Если у ЦП его нет, он должен быть встроен в материнскую плату. Стоимость довольно небольшая.
Сводка команд и опций
Вот сводка наиболее часто используемых опций инструмента генерации ключей:
-b «Биты»
Эта опция определяет количество бит в ключе.Правила, регулирующие вариант использования SSH, могут требовать использования определенной длины ключа.
Обычно считается, что для ключей RSA достаточно 2048 бит.
-e «Экспорт»
Эта опция позволяет переформатировать существующие ключи между форматом файла ключей OpenSSH и форматом, задокументированным в RFC 4716, «Формат файла открытого ключа SSH».
-p «Изменить кодовую фразу»
Эта опция позволяет изменить парольную фразу файла закрытого ключа на [-P старая_парольная фраза]
и [-N новая_парольная фраза]
, [-f ключевой файл]
.
-t «Тип»
Эта опция определяет тип создаваемого ключа.
Обычно используемые значения:
— RSA для ключей RSA
— dsa для ключей DSA
— ecdsa для ключей DSA с эллиптической кривой
-i «Вход»
Если для доступа к существующему ключу требуется ssh-keygen , этот параметр обозначает файл.
-f «Файл»
Задает имя файла, в котором будет храниться созданный ключ.
-N «Новый»
Предоставляет новую парольную фразу для ключа.
-P «Кодовая фраза»
Предоставляет (старую) кодовую фразу при чтении ключа.
-c «Комментарий»
Изменяет комментарий к ключевому файлу.
-p Измените кодовую фразу для файла закрытого ключа.
-q Отключение ssh-keygen.
-v Подробный режим.
-l «Отпечаток пальца»
Распечатайте отпечаток указанного открытого ключа.
-Б «Пузырьковый лепет»
Показывает «пузырчатый лепет» (формат Tectia) ключевого файла.
-F Поиск указанного имени хоста в файле known_hosts.
-R Удаляет все ключи, принадлежащие имени хоста, из файла known_hosts.
-y Прочитать закрытый файл формата OpenSSH и распечатать открытый ключ OpenSSH в стандартный вывод.
Здесь перечислены только наиболее часто используемые параметры. Для полного использования, включая более экзотические и специальные варианты, используйте команду man ssh-keygen
.
RSA-шифрование с закрытым ключом и дешифрование с открытым ключом
Два ключа $ (e, m) $ и $ (d, m) $ в паре ключей RSA полностью эквивалентны, поскольку $ e $ и $ d $ могут быть произвольно выбранными целыми числами (в интервале $ 0..m-1 $), если они удовлетворяют хорошо известному сравнению $ ed \ Equiv 1 \ mod \ phi (m) $. Вы можете поменять их местами, и ничего не изменится.
Ключ становится общедоступным
в тот момент, когда вы (как генератор ключей) решаете раскрыть его, возможно, и злоумышленникам. Следовательно, ключ, который вы решите раскрыть , а не , становится закрытым ключом
.
Когда вы используете пару ключей для целей конфиденциальности , вы обычно хотите, чтобы каждый мог отправлять конфиденциальные сообщения получателю, чтобы только такой получатель мог их интерпретировать. В таком случае все разделяют ключ (который будет публичным
ключом по определению выше, используемым для шифрования ), тогда как у получателя есть тот, который никому не передается (это должен быть частный
ключ, используемый для расшифровки ).
Идея использования открытого ключа
для дешифрования подрывает саму цель наличия схемы обеспечения конфиденциальности, как определено выше. Зачем вообще использовать шифрование, если кто-нибудь (включая злоумышленника) может его отменить?
Если вы думаете: « Может быть, я смогу безопасно передать открытый ключ только предполагаемому получателю », то вы вообще не раскрываете какой-либо ключ, и определение public
и private
больше не актуально: вы используйте RSA как своего рода шифр с секретным ключом, например AES.
С другой стороны, когда вы используете пару ключей для целей аутентификации , вы обычно хотите, чтобы каждый (включая любого фальсификатора) мог с уверенностью установить, что сообщение действительно исходит от определенного отправителя, а не от кого-либо еще. В таком случае все разделяют ключ (который снова является открытым ключом
, который используется для проверки ), тогда как отправитель получает ключ, который никому не раскрывается (это должен быть закрытый ключ
, используемый для подписи ).
Как и раньше, использование открытого ключа
для подписи противоречиво.
Наконец, следует отметить, что открытый ключ
(в любом случае) принимает особую форму ( 3
, 65537
и т. Д.). Это чисто для целей эффективности (поскольку ключ должен быть публичным
в любом случае, почему бы нам не выбрать тот, с которым легко справиться с вычислительной точки зрения?), И это не связано с безопасностью.
Обмен ключами
Диффи-Хеллмана vs.Шифрование RSA | Venafi
Какой алгоритм вам подходит?
Шифрование
не следует рассматривать как окончательный ответ на любую проблему информационной безопасности, а только как часть уравнения безопасности. Эту концепцию всегда следует учитывать при выборе алгоритма открытого ключа. Однако перед тем, как углубляться в какой-либо проект шифрования, проведите тщательный анализ рисков ваших данных и систем, чтобы определить, что вам нужно. Очевидно, что данные с высоким уровнем риска, такие как конфиденциальные данные клиентов, требуют лучшего шифрования, чем маркетинговые планы, которые в случае разглашения окажут гораздо меньшее влияние на бизнес.
Во-вторых, с точки зрения производительности, тщательный анализ сетевой архитектуры и нагрузки, которую она может выдерживать, поможет решить, какой маршрут шифрования выбрать. В общем, шифрование с открытым ключом или асимметричное шифрование примерно в 10 000 раз медленнее, чем шифрование с закрытым ключом. Это связано с тем, что при асимметричном шифровании создаются и обмениваются два ключа по сравнению с одним при частном или симметричном шифровании.
Обмен ключами Диффи-Хеллмана и RSA (названный в честь своих изобретателей Ривест-Шамир-Адлеман) — два самых популярных алгоритма шифрования. Чем они отличаются друг от друга? Какой из них следует использовать организации? Чтобы дать ответ, давайте вкратце рассмотрим как
Обмен ключами Диффи-Хеллмана
Обмен ключами Диффи-Хеллмана, также называемый экспоненциальным обменом ключами, представляет собой метод цифрового шифрования, который использует числа, возведенные в определенные степени, для создания ключей дешифрования на основе компонентов, которые никогда не передаются напрямую, что делает задачу предполагаемого взломщика кода математически потрясающе.Обмен ключами Диффи – Хеллмана устанавливает общий секрет между двумя сторонами, который может использоваться для секретной связи для обмена данными по общедоступной сети, и фактически использует методы открытого ключа, позволяющие обмениваться частным ключом шифрования.
Чтобы упростить объяснение того, как работает алгоритм, мы будем использовать небольшие положительные целые числа. На самом деле алгоритм использует большие числа. Кроме того, вы можете найти довольно простые объяснения в Википедии и Академии Хана.
Общаясь открыто, Алиса и Боб договариваются о двух натуральных числах, простом числе и генераторе.Генератор — это число, которое при возведении в степень целого положительного числа меньше простого, никогда не дает одинаковый результат для любых двух таких целых чисел. Предположим, что Алиса будет использовать простое число 17, а Боб — генератор 3. Затем Алиса выбирает частное случайное число, скажем 15, и вычисляет 3 15 mod17 , что равно 6, и отправляет результат Бобу публично.
Затем Боб выбирает свое частное случайное число, например 13, вычисляет 3 13 mod17 и отправляет результат (который равен 12) публично Алисе.Суть уловки — это следующее вычисление. Алиса берет открытый результат Боба (= 12) и вычисляет 12 15 mod17 . Результат (= 10) — их общий секретный ключ. С другой стороны, Боб берет публичный результат Алисы (= 6) и вычисляет 6 13 mod17 , что снова приводит к тому же общему секрету. Теперь Алиса и Боб могут общаться, используя симметричный алгоритм по своему выбору и общий секретный ключ, который никогда не передавался по незащищенной цепи.
Если третья сторона прослушивает обмен, этой стороне будет сложно определить секретный ключ с вычислительной точки зрения. Фактически, при использовании больших чисел это действие требует больших вычислительных ресурсов для современных суперкомпьютеров, чтобы выполнить его за разумное время.
RSA
RSA — это криптосистема для шифрования с открытым ключом, которая широко используется для защиты конфиденциальных данных, особенно при передаче по небезопасной сети, такой как Интернет. RSA был впервые описан в 1977 году Роном Ривестом, Ади Шамиром и Леонардом Адлеманом из Массачусетского технологического института.Криптография с открытым ключом, также известная как асимметричная криптография, использует два разных, но математически связанных ключа, один открытый и один закрытый. Открытый ключ может быть передан всем, а закрытый ключ должен храниться в секрете. В криптографии RSA как открытый, так и закрытый ключи могут шифровать сообщение; ключ, противоположный тому, который используется для шифрования сообщения, используется для его расшифровки. Этот атрибут является одной из причин, по которой RSA стал наиболее широко используемым асимметричным алгоритмом: он обеспечивает метод обеспечения конфиденциальности, целостности, подлинности и неуверенности электронных сообщений и хранения данных.
Безопасность
RSA объясняется сложностью факторизации больших целых чисел, которые являются произведением двух больших простых чисел. Умножить эти два числа легко, но определение исходных простых чисел из общей суммы, то есть факторинг, считается невозможным из-за того, что на это потребуется время даже при использовании современных суперкомпьютеров. Алгоритм RSA включает четыре этапа: генерация ключа, распределение ключей, шифрование и дешифрование. Алгоритмы генерации открытого и закрытого ключей являются наиболее сложной частью криптографии RSA и выходят за рамки этой статьи. Вы можете найти пример на Tech Target.
Какие отличия?
И RSA, и алгоритм Диффи-Хеллмана являются алгоритмами шифрования с открытым ключом, достаточно сильными для коммерческих целей, поскольку оба они основаны на предположительно неразрешимых проблемах, сложности факторизации больших чисел и возведения в степень и модульной арифметики соответственно. Минимальная рекомендуемая длина ключа для систем шифрования составляет 128 бит, и обе они превышают длину ключа 1024 бит. Оба были подвергнуты тщательной проверке математиками и криптографами, но при правильной реализации ни один из них не является значительно менее безопасным, чем другой.
Однако характер обмена ключами Диффи-Хеллмана делает его уязвимым для атак «человек посередине» (MITM), поскольку он не аутентифицирует ни одну из сторон, участвующих в обмене. Маневр MITM также может создавать пару ключей и ложные сообщения между двумя сторонами, которые думают, что они оба общаются друг с другом. Вот почему Diffie-Hellman используется в сочетании с дополнительным методом аутентификации, обычно с цифровыми подписями.
В отличие от Диффи-Хеллмана, алгоритм RSA может использоваться для подписания цифровых подписей, а также для обмена симметричным ключом, но он требует предварительного обмена открытым ключом.Однако недавнее исследование показало, что даже 2048-битные ключи RSA могут быть эффективно понижены с помощью атаки «человек в браузере» или атак оракула. В отчете говорится, что самая безопасная контрмера — отказаться от обмена ключами RSA и перейти на обмен ключами Диффи-Хеллмана (эллиптическая кривая).
Заключение
Какой из них лучший? На этот вопрос сложно ответить, и на различных форумах было много дискуссий. Итак, ответ, как обычно, — «смотря по обстоятельствам».Обычно вы предпочитаете RSA, а не Diffie-Hellman, или Diffie-Hellman, а не RSA, в зависимости от ограничений взаимодействия и в зависимости от контекста. Производительность редко имеет значение, а что касается безопасности, с точки зрения высокого уровня, 1024-битный ключ Диффи-Хеллмана так же устойчив к криптоанализу, как 1024-битный ключ RSA. Выбор остается за вами.
Подробнее о защите личных данных машины. Исследуй сейчас.
Похожие сообщения
Защита ключей и сертификатов RSA для устройств IoT
Фон
Атака
RSA используется в процессе шифрования данных для отправки по сети.Сервер передает свой открытый ключ RSA клиенту как часть рукопожатия SSL или TLS. Часть открытого ключа RSA содержит модуль n = p * q, где p и q — два случайно выбранных простых числа одинакового размера. Простые числа p и q хранятся в секрете, поскольку знание этих значений позволяет вычислить закрытый ключ.
Обеспечение того, чтобы p и q были выбраны с достаточной случайностью, является важным компонентом защиты открытого ключа. Факторизация большого модуля n для получения p и q невозможна при нормальных обстоятельствах.Однако, если ключи генерируются с плохой случайностью, возникает проблема, что два открытых ключа будут иметь общий фактор, как только будет сгенерировано достаточное количество ключей. Если два модуля RSA n 1 и n 2 разделяют ровно один простой множитель p, то вычисление наибольшего общего делителя (GCD) n 1 и n 2 покажет значение p. Вычисление GCD значительно проще, чем простой факторинг, и его легко выполнить на практике. Остальные множители n 1 и n 2 могут быть легко найдены с помощью простых вычислений n 1 ⁄ p и n 2 ⁄ p, соответственно, компрометируя оба ключа.Это вычисление GCD может быть масштабировано для анализа всех пар ключей за субквадратичное время по количеству ключей [1].
Выбор простых множителей подходящего размера с равномерной случайностью должен предотвратить на практике два модуля, когда-либо делящих множитель. Однако, если при выборе простых чисел возникает ошибка в генерации случайных чисел, вероятна коллизия в достаточно большом наборе данных. Злоумышленники могут использовать эти знания для сбора большого количества открытых ключей RSA, а затем искать GCD между своими модулями для поиска факторов, общих для любой пары.
Предыдущие исследовательские группы провели обширное сканирование Интернета, чтобы продемонстрировать и изучить последствия этой атаки. Атака привлекла большое внимание в 2012 году, и исследователям удалось взломать десятки тысяч ключей. За атакой в 2016 году последовало продолжение атаки на значительно большем наборе данных с акцентом на тенденции появления слабых ключей от различных поставщиков. При разработке нашего анализа мы сосредоточились на трех предыдущих публикациях [1], [2] и [3].
Ленстра 2012
Авторами [2] собрано около 6.2 миллиона цифровых сертификатов через Интернет, и было обнаружено, что примерно 4,3% этих сертификатов полностью разделяют свой модуль RSA с другим. Авторы сгруппировали сертификаты вместе по модулю для дальнейшего изучения этого дублирования. Примечательно, что были обнаружены отдельные кластеры размером 16489, 8366, 6351 и 5055, и 58913 кластеров имеют ровно два сертификата. Кроме того, они обнаружили, что 12934 различных модуля RSA можно разложить на множители. Авторы обнаружили 1200 факторов, которые разделяются более чем одним модулем.Наиболее широко используемые индивидуальные факторы получили до 4627 сертификатов.
Хенингер 2012
В [1] исследователи собрали 5,8 миллиона уникальных сертификатов TLS и 6,2 миллиона уникальных ключей хоста SSH. Между этими двумя коллекциями они нашли 11 миллионов различных модулей RSA и смогли разложить на множители 16 717 различных открытых ключей. В результате было взломано 23 576 (0,4%) их сертификатов TLS и 1013 (0,02%) ключей хоста RSA SSH.
Авторы исследовали причины факторов разделения модулей, исследуя реализации генерации случайных чисел.Основная проблема неправильной генерации случайных чисел была связана с низким уровнем энтропии в пуле случайных чисел при генерации ключей. Эта проблема чаще всего возникает на легких устройствах, которые не имеют большого количества входных данных для получения энтропии.
Этот анализ показал, что только два модуля общедоступных доверенных сертификатов могут быть учтены, и оба сертификата просрочены. Подавляющее большинство взломанных ключей поступило от сетевых устройств, таких как маршрутизаторы, модемы или межсетевые экраны.
Гастингс 2016
Результаты 2012 года [1] были повторно рассмотрены в 2016 году в [3] с упором на изучение того, как поставщики и конечные пользователи отреагировали на уязвимости. Авторы исследовали 81 миллион различных ключей RSA и смогли разложить на множители 313 000 ключей (0,37%). Они также исследуют тенденции количества слабых ключей от различных компаний. С 2012 года было обнаружено, что значительное количество новых устройств от таких компаний, как Huawei, D-Link и ADTRAN, имеют уязвимые ключи RSA.
Кроме того, конечные пользователи крайне редко исправляли свои устройства для исправления уязвимостей, обнаруженных в ходе исследования 2012 года.Авторы отмечают «печальные последствия», которые это имеет для эпохи Интернета вещей, поскольку количество устройств в сети быстро растет.
Расцвет Интернета вещей и облачных вычислений
Несмотря на большое количество ключей, ранее сломанных этой атакой, маловероятно, что ключ, который был правильно сгенерирован с достаточным количеством энтропии, может быть взломан с помощью этой техники. Однако требование достаточной энтропии не всегда может быть выполнено при генерации ключей. В частности, некоторым устройствам Интернета вещей может не хватить энтропии для генерации ключей без внешнего источника.Крупные веб-сайты также могут оказаться уязвимыми для этой уязвимости, поскольку открытые и закрытые ключи, используемые с их сертификатами SSL / TLS, генерируются владельцем или администратором веб-сайта, а не центром сертификации, который подписывает сертификат, чтобы сделать его публично доверенным. Это означает, что процесс, который операторы сайта использовали для генерации своих ключей, непрозрачен для CA, и, как правило, они не могут анализировать представленный открытый ключ на предмет неэффективной генерации.
По мере продолжения роста Интернета и Интернета вещей размеры сетей значительно выросли, и устройства, подключенные к Интернету, появляются в новых местах.Безопасность является серьезной проблемой в этом ландшафте из-за растущего объема данных, обрабатываемых этими устройствами, и появления подключенных устройств в чувствительных местах, таких как операционные и транспортные средства. Взлом любого устройства в этих критических сетях может привести к катастрофическому отказу, если не будут приняты надлежащие меры предосторожности. Точно так же потребители все больше полагаются на общедоступные веб-службы для обработки конфиденциальных данных и выполнения важных операций, таких как финансовые транзакции, передача и хранение ценной интеллектуальной собственности, а также приложения для получения кредита или других услуг.Возможность злоумышленника получить эту конфиденциальную информацию или выполнить мошеннические операции может существенно повлиять на потребителей.
Рост технологий IoT и ресурсов облачных вычислений с момента первоначальной публикации этого метода делает его более опасным в сегодняшних условиях по нескольким причинам:
IoT В БОЛЬШИНСТВЕ КОМПОНЕНТА ЛЕГКИХ УСТРОЙСТВ.
Нет ничего небезопасного по своей сути в том, как такое устройство будет генерировать ключ RSA, но [1] обнаружил, что легкие устройства в первую очередь подвержены риску этой атаки из-за их состояния с низкой энтропией. Энтропия в устройстве необходима для предотвращения предсказуемости генерации случайных чисел. Исследователи смогли найти детерминированный «случайный» выход при удалении энтропии. Легкие устройства IoT особенно склонны к состоянию с низкой энтропией из-за отсутствия входных данных, которые они могут получить, а также из-за проблемы экономичного включения аппаратной генерации случайных чисел. Поэтому ключи, генерируемые облегченными устройствами IoT, рискуют оказаться недостаточно случайными, что увеличивает вероятность того, что два ключа имеют общий фактор и позволят ключу быть взломанным.Авторы [1] обнаружили, что большинство взломанных ключей были от устройств с низким уровнем ресурсов. Только два ключа на двух сертификатах были общедоступными, и срок действия обоих сертификатов истек.
АТАКА СТАНОВИТСЯ БОЛЕЕ УСПЕШНОЙ, КОГДА ИССЛЕДОВАНО БОЛЬШЕ ПЕРВИЧНЫХ ФАКТОРОВ.
По мере роста числа обнаруженных сертификатов количество пар сертификатов для анализа общих факторов увеличивается квадратично. В сфере Интернета вещей резко увеличилось количество устройств в сетях, и эта тенденция будет только сохраняться.Оценки и прогнозы значительно различаются, но, по прогнозам Gartner, в течение следующего года в Интернете будет развернуто 20 миллиардов устройств [4].
УСТРОЙСТВА НАХОДЯТСЯ В НОВЫХ И БОЛЕЕ КРИТИЧЕСКИХ УСЛОВИЯХ.
Взлом ключа RSA в 2019 году может привести к катастрофическим последствиям. Взлом ключа RSA теперь означает больше, чем компрометацию личных или корпоративных данных. Критически важные среды реального времени, такие как операционные, автомобили, промышленные устройства управления и домашние системы безопасности, теперь работают с использованием ключей RSA.Таким образом, физическая собственность и жизнь теперь находятся под угрозой из-за взлома ключей RSA.
УСТРОЙСТВА IoT БОЛЬШЕ СЛОЖНО ПАТЧИРОВАТЬ.
Установка исправлений для множества устройств IoT в сети может быть утомительной для пользователя. Пользователь может рассматривать и управлять множеством независимых устройств, часто без централизованной автоматизации для всех устройств. В некоторых случаях, когда исходная конструкция устройства не поддерживает установку исправлений или когда устройство недоступно, установка исправлений может оказаться невозможной. Кроме того, из-за длительного срока службы некоторых устройств IoT вполне возможно, что уязвимости могут быть обнаружены на действующих устройствах, которые больше не поддерживаются производителем.Это означает, что уязвимость для взлома ключа может использоваться гораздо дольше, и ее сложнее исправить.
ВЫЧИСЛИТЕЛЬНЫЕ И СКАНИРУЮЩИЕ РЕСУРСЫ БОЛЕЕ ДОСТУПНЫ.
Облачные сервисы доступны для аренды, чтобы злоумышленник мог эффективно собирать и анализировать данные. Единственное препятствие, с которым действительно сталкивается противник в этой атаке, — это детали реализации. Сама атака была хорошо изучена и понятна, и ресурсы, необходимые для ее выполнения, теперь также легко доступны по умеренной цене.Чтобы проиллюстрировать, ресурсы разработки и вычислений, затраченные на это исследование, без учета сбора данных, составили менее 3000 долларов. Кроме того, предварительно собранные наборы данных сертификатов и ключей доступны для покупки или даже для бесплатной загрузки, что может сократить время и затраты злоумышленника на выполнение этого вычисления.
По указанным выше причинам мы считаем необходимым пересмотреть последствия этой атаки в современных условиях. Как и в предыдущих работах, цель этого исследования — обеспечить осведомленность об этой атаке и улучшить безопасность в Интернете в целом.Учитывая характер исследования, для нашего анализа необходимо использовать реальные данные. Однако, поскольку в результате образуются скомпрометированные ключи, используемые для защиты реальных коммуникаций, мы не предоставляем подробную информацию о сломанных ключах, кроме статистических сводок высокого уровня, и мы не сохраняем сломанные ключи после их использования в этом проекте.
Криптосистема RSA — Концепции
Криптосистема RSA — одна из первых криптосистем с открытым ключом , основанная на математике модульного возведения в степень и вычислительной сложности задачи RSA и тесно связанной с ней целочисленная задача факторизации ( IFP ). Алгоритм RSA назван в честь начальных букв его авторов ( R ivest– S hamir– A dleman) и широко используется в ранние века компьютерной криптографии.
Позже, когда появилась криптография ECC , ECC постепенно стал доминирующим в асимметричных криптосистемах из-за его более высокой безопасности и меньшей длины ключа, чем RSA .
Алгоритм RSA обеспечивает:
Генерация пары ключей : генерировать случайный закрытый ключ (обычно размером 1024-4096 бит) и соответствующий открытый ключ .
Шифрование : зашифровать секретное сообщение (целое число в диапазоне [0 … key_length]) с помощью открытого ключа и расшифровать обратно с помощью секретного ключа.
Цифровые подписи : подписывают сообщения (используя закрытый ключ) и проверяют подпись сообщения (используя открытый ключ).
Обмен ключами : безопасная передача секретного ключа, который позже будет использоваться для зашифрованной связи.
RSA может работать с ключами различных ключей длиной : 1024, 2048, 3072, 4096, 8129, 16384 или даже больше. Длина ключа 3072 бита и выше считается безопасными . Более длинные ключи обеспечивают более высокий уровень безопасности, но требуют на вычислительного времени больше , поэтому существует компромисс между безопасностью и скоростью. Очень длинные ключи RSA (например, 50000 бит или 65536 бит) могут быть слишком медленными для практического использования , например генерация ключа может занять от нескольких минут до нескольких часов.
Создание пары открытого и закрытого ключей RSA включает следующее:
Используя некоторые нетривиальные математические вычисления из теории чисел, найдите три очень больших целых числа e , d и n , что:
( me ) d ≡ m (mod n ) для всех m в диапазоне [0… n )
Целое число n называется « модуль » и определяет длину ключа RSA . Обычно это очень большое простое число (например, 2048 бит).
Пара { n , e } — это открытый ключ . Он разработан, чтобы поделиться им со всеми. Число e называется « экспонента открытого ключа ».Обычно это 65537 (0x010001).
Пара { n , d } — это закрытый ключ . Он разработан, чтобы хранить его в секрете. Практически невозможно вычислить закрытый ключ из открытого ключа { n , e }. Число d называется « показатель закрытого ключа » (показатель секретности).
Пример 2048-бит RSA с открытым ключом (представлен в виде 2048-битового шестнадцатеричное целого числа по модулю п и 24-битный открытый показатель степени е ):
п = 0xa709e2f84ac0e21eb0caa018cf7f697f774e96f8115fc2359e9cf60b1dd8d4048d974cdf8422bef6be3c162b04b916f7ea2133f0e3e4e0eee164859bd9c1e0ef0357c142f4f633b4add4aab86c8f8895cd33fbf4e024d9a3ad6be6267570b4a72d2c34354e0139e74ada665a16a2611490debb8e131a6cffc7ef25e74240803dd71a4fcd953c988111b0aa9bbc4c57024fc5e8c4462ad9049c7f1abed859c63455fa6d58b5cc34a3d3206ff74b9e96c336dbacf0cdd18ed0c66796ce00ab07f36b24cbe3342523fd8215a8e77f89e86a08db911f237459388dee642dae7cb2644a03e71ed5c6fa5077cf4090fafa556048b536b879a88f628698f0c7b420c4b7
е = 0x010001
Тот же открытый ключ RSA, закодированный в традиционном для RSA формате PKCS # 8 PEM ASN.1 выглядит следующим образом:
----- НАЧАТЬ PUBLIC KEY -----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApwni + ErA4h6wyqAYz39p
f3dOlvgRX8I1npz2Cx3Y1ASNl0zfhCK + 9r48FisEuRb36iEz8OPk4O7hZIWb2cHg
7wNXwUL09jO0rdSquGyPiJXNM / v04CTZo61r5iZ1cLSnLSw0NU4BOedK2mZaFqJh
FJDeu44TGmz / х + 8l50JAgD3XGk / NlTyYgRGwqpu8TFcCT8XoxEYq2QScfxq + 2FnG
NFX6bVi1zDSj0yBv90uelsM226zwzdGO0MZnls4AqwfzayTL4zQlI / 2CFajnf4no
agjbkR8jdFk4je5kLa58smRKA + ce1cb6UHfPQJD6 + lVgSLU2uHmoj2KGmPDHtCDE
twIDAQAB
6IC 9052 КОНЕЦ PUBL9.1-закодированное сообщение, содержащее открытый ключ RSA, можно декодировать здесь: https://lapo.it/asn1js.Пример 2048-битного закрытого ключа RSA , соответствующего приведенному выше открытому ключу (представлен в виде шестнадцатеричного 2048-битного целочисленного модуля n и 2048-битного секретного показателя d ):
п = 0xa709e2f84ac0e21eb0caa018cf7f697f774e96f8115fc2359e9cf60b1dd8d4048d974cdf8422bef6be3c162b04b916f7ea2133f0e3e4e0eee164859bd9c1e0ef0357c142f4f633b4add4aab86c8f8895cd33fbf4e024d9a3ad6be6267570b4a72d2c34354e0139e74ada665a16a2611490debb8e131a6cffc7ef25e74240803dd71a4fcd953c988111b0aa9bbc4c57024fc5e8c4462ad9049c7f1abed859c63455fa6d58b5cc34a3d3206ff74b9e96c336dbacf0cdd18ed0c66796ce00ab07f36b24cbe3342523fd8215a8e77f89e86a08db911f237459388dee642dae7cb2644a03e71ed5c6fa5077cf4090fafa556048b536b879a88f628698f0c7b420c4b7
d = 0x10f22727e552e2c86ba06d7ed6de28326eef76d0128327cd64c5566368fdc1a9f740ad8dd221419a5550fc8c14b33fa9f058b9fa4044775aaf5c66a999a7da4d4fdb8141c25ee5294ea6a54331d045f25c9a5f7f47960acbae20fa27ab5669 c80eaf235a1d0b1c22b8d750a191c0f0c9b3561aaa4934847101343920d84f24334d3af05fede0e355911c7db8b8de3bf435907c855c3d7eeede4f148df830b43dd360b436ac10e566f138fb4b30fb1af0603cfcf0cd8adf4349a0d0b93bf89804e7c2e24ca7615e51af66dccfdb71a1204e2107abbee4259f2cac917fafe3b029baf13c4dde7923c47ee3fec2483a384b9eb773c154540c5196bce1
То же RSA секретный ключ, закодированные в традиционном для формата PKCS # RSA 8 PEM ASN.1 выглядит немного длиннее:
+
----- BEGIN RSA PRIVATE KEY -----MIIEowIBAAKCAQEApwni + ErA4h6wyqAYz39pf3dOlvgRX8I1npz2Cx3Y1ASNl0zf
HCK + 9r48FisEuRb36iEz8OPk4O7hZIWb2cHg7wNXwUL09jO0rdSquGyPiJXNM / v0
4CTZo61r5iZ1cLSnLSw0NU4BOedK2mZaFqJhFJDeu44TGmz / х + 8l50JAgD3XGk / N
lTyYgRGwqpu8TFcCT8XoxEYq2QScfxq + 2FnGNFX6bVi1zDSj0yBv90uelsM226zw
zdGO0MZnls4AqwfzayTL4zQlI / 2CFajnf4noagjbkR8jdFk4je5kLa58smRKA + CE
1cb6UHfPQJD6 + lVgSLU2uHmoj2KGmPDHtCDEtwIDAQABAoIBABDyJyflUuLIa6Bt
ftbeKDJu73bQEoMnzWTFVmNo / cGp90CtjdIhQZpVUPyMFLM / qfBYufpARHdar1xm
qZmn2k1P24FBwl7lKU6mpUMx0EXyXJpff0eWCsuuIPonq1ZpyA6vI1odCxwiuNdQ oZHA8MmzVhqqSTSEcQE0OSDYTyQzTTrwX + 3g41WRHh34uN479DWQfIVcPX7u3k8U
jfgwtD3TYLQ2kiOawQ5WbxOPtLMPsa8GA8 / PDNit9DSaDQuTv4mATnwuJMp2FeUa
9m3M / bcaEgTiEHq77kJZ8srJF / г + OwKbrxPE3eeSPEfuP + wkg5AgOjhLnrdzwVRU
DFGWvOECgYEAyIk7F0S0AGn2aryhw9CihDfimigCxEmtIO5q7mnItCf eQwYPsX72
1fLpJNgfPc9DDfhAZ2hLSsBlAPLUOa0Cuny9PCBWVuxi1WjLVaeZCV2bF11mAgW2 fjLkAXT34IX + HZl60VoetSWq9ibfkJHeCAPnh / yjdB3Vs + 2wxNkU8m8CgYEA1Tzm
mjJq7M6f + zMo7DpRwFazGMmrLKFmHiGBY6sEg7Emoeh3CkAQePIGQw / Rk16gWJR6
DtUZ9666sjCH6 / 79rx2xg + 9AB76XTFFzIxOk9cm49cIosDMk4mogSfK0Zg8nVbyW
5nEb // 9JCrZ18g4lD3IrT5VJoF4MhfdBUjAS1jkCgYB + RDIpv3 + bNx0KLgWpFwgN
Omb667B6SW2ya4x227KdBPFkwD9HYosnQZDdOxvIvmUZObPLqJan1aaDR2Krgi1S oNJCNpZGmwbMGvTU1Pd + Nys9NfjR0ykKIx7 / b9fXzman2ojDovvs0W / pF6bzD3V /
FH5HWKLOrS5u4X3JJGqVDwKBgQCd953FwW / gujld + EpqpdGGMTRAOrXqPC7QR3X5
Beo0PPonlqOUeF07m9 / zsjZJfCJBPM0nS8sO54w7ESTAOYhpQBAPcx / 2HMUsrnIj
HBxqUOQKe6l0zo6WhJQi8 / + cU8GKDEmlsUlS3iWYIA9EICJoTOW08R04BjQ00jS7
1A1AUQKBgHlHrV / 6S / 4hjvMp + 30hX5DpZviUDiwcGOGasmIYXAgwXepJUq0xN6aa
ЛСТ + ykLGSMMY / LABQiNZALZQtwK35KTshnThK6zB4e9p8JUCVrFpssJ2NCrMY3SU
qw87K1W6engeDrmunkJ / PmvSDLYeGiYWmEKQbLQch Txx1IEddXkK
----- END RSA PRIVATE KEY -----
Он содержит всю структуру пары ключей RSA , а также несколько дополнительных параметров: 2048-битный модуль n , 24- публичный показатель степени e , 2048-разрядный показатель секретности d , первый фактор p , второй фактор q и 3 других целых числа из внутренней структуры данных RSA:
выше PEM ASN.1-закодированное сообщение, содержащее данные закрытого ключа RSA, можно декодировать здесь: https://lapo.it/asn1js.
Шифрование сообщения с использованием определенного открытого ключа RSA { n , e } выполняется следующим преобразованием:
encryptedMsg = ( msg = ( ) ) e mod n
msg здесь - число в диапазоне [0... n ). Перед шифрованием текстовые сообщения должны быть закодированы как целые числа в диапазоне [0 ... n ) (см. EAOP). Для больших текстов следует использовать гибридное шифрование (зашифровать секретный ключ и использовать его для симметричного шифрования текста, см. RSA-KEM).
Вышеупомянутая операция не может быть отменена : не существует эффективного алгоритма для вычисления msg из encryptedMsg , e и n (см. Проблему RSA), которые все являются общедоступный (не секретный) по дизайну.
Расшифровка зашифрованного сообщения с использованием соответствующего закрытого ключа RSA { n , d } выполняется следующим преобразованием:
decryptedMsg 14 = ( decrypted ) d mod n
Почему это правильно? Напомним, что по определению пара ключей RSA имеет следующее свойство:
( me ) d ≡ m (mod n ) для любого m в диапазоне [0... n )
Из преобразования шифрования мы получаем:
encryptedMsg = ( msg ) e 56 9142 9145 9145 9145
Отсюда:
decryptedMsg = ( encryptedMsg ) d mod n = (( msg1400236 9142 9006 9446 9446 9446 9006 9446 9006 9142 9006 9446 9006 9446 9446 ) d = (( msg ) e ) d mod n = ( msg ) mod = n msg
Давайте рассмотрим один пример шифрования и дешифрования RSA вместе с вычислениями по приведенной выше формуле с.Предположим, мы сгенерировали пару открытого и закрытого ключей RSA:
открытый ключ = { n , e } = {143, 7}
закрытый ключ = { n , d } = {143, 103}
Давайте зашифруем секретное сообщение msg = 83 . Просто следуйте формуле:
encryptedMsg = msge mod n = 837 mod 143 = 27136050989627 mod 143 = 8
Теперь зашифровано сообщение вернулось к исходному значению:
расшифровано MSG = зашифровано MSGD mod n = 8103 mod 143 = 104296241988325687616944416016184583518175569594441601618458351817556959345325 9992 9992 99 9995Это связано с тем, что пара ключей соответствует свойству RSA:
( me ) d ≡ m (mod n ) для всех m в диапазон [0 ... n )
( м 7) 103 ≡ м (мод. 143 ) для всех м в диапазоне [0 ... 143 )
В реальном мире обычно модуль RSA n и частный показатель d представляют собой 3072-битные или 4096-битные целые числа, а общедоступные показатель степени e равен 65537.
Для дальнейшего чтения ознакомьтесь с этим превосходным объяснением , как работает RSA , подробно с объяснениями и примерами: http://doctrina.org/How-RSA-Works-With-Examples.html.
Поскольку шифрование RSA является детерминированным , (не имеет случайного компонента), злоумышленники могут успешно запустить атаку с выбранным открытым текстом против , зашифровав вероятные открытые тексты с помощью открытого ключа и проверить, равны ли они зашифрованному тексту. Это может не быть проблемой, но это слабое место , которое следует учитывать при выборе схемы шифрования разработчиками.
Гибридные схемы шифрования, такие как RSA-KEM , устраняют эту уязвимость и позволяют шифровать более длинные тексты.
RSA - документация PyCryptodome 3.9.9
RSA - наиболее распространенный и используемый алгоритм с открытым ключом. Его безопасность
основанный на сложности факторизации больших целых чисел. Алгоритм имеет
выдерживал атаки более 30 лет, поэтому считается
достаточно безопасно для новых разработок.Алгоритм может использоваться как для обеспечения конфиденциальности (шифрование), так и для
аутентификация (цифровая подпись).Стоит отметить, что подписание и
расшифровка выполняется значительно медленнее, чем проверка и шифрование.Криптографическая стойкость в первую очередь связана с длиной модуля RSA n .
В 2017 году считается, что достаточной длиной будет 2048 бит. Для дополнительной информации,
см. самый последний отчет ECRYPT.И зашифрованные тексты RSA, и подписи RSA имеют размер, равный модулю RSA n (256
байтов, если n имеет длину 2048 бит).Модуль
Crypto.PublicKey.RSA
предоставляет средства для генерации новых ключей RSA,
реконструировать их из известных компонентов, экспортировать и импортировать.В качестве примера, вот как вы генерируете новую пару ключей RSA, сохраняете ее в файле
позвонил по номеруmykey.pem
, а затем перечитал:>>> из Crypto.PublicKey import RSA >>> >>> ключ = RSA.generate (2048) >>> f = open ('mykey.pem', 'wb') >>> f.write (key.export_key ('PEM')) >>> е.Закрыть() ... >>> f = open ('mykey.pem', 'r') >>> key = RSA.import_key (f.read ())
-
Крипто.Публичный ключ.RSA.
сгенерировать
( бит , randfunc = Нет , e = 65537 ) Создайте новую пару ключей RSA.
Алгоритм близко следует NIST FIPS 186-4 в его
разделы B.3.1 и B.3.3. Модуль - это произведение
два несильных вероятных простых числа.
Каждое простое число проходит соответствующее количество тестов Миллера-Рабина.
со случайными основаниями и одним тестом Лукаса.Параметры: - бит ( целое число ) - длина ключа или размер (в битах) модуля RSA.
Он должен быть не менее 1024, но рекомендуется 2048.
Стандарт FIPS определяет только 1024, 2048 и 3072. - randfunc ( вызываемый ) - функция, которая возвращает случайные байты.
По умолчанию -Crypto.Random.get_random_bytes ()
. - e ( целое число ) - публичная экспонента RSA.Это должно быть нечетное положительное целое число.
Обычно это небольшое число с очень немногими
двоичное представление.
Стандарт FIPS требует, чтобы публичная экспонента была
не менее 65537 (по умолчанию).
Возвращает: объект ключа RSA (
RsaKey
, с закрытым ключом).- бит ( целое число ) - длина ключа или размер (в битах) модуля RSA.
-
Крипто.Публичный ключ.RSA.
конструкция
( rsa_components , consistency_check = True ) Создайте ключ RSA из кортежа допустимых компонентов RSA.
Модуль n должен быть произведением двух простых чисел.
Открытая экспонента e должна быть нечетной и больше 1.В случае закрытого ключа должны применяться следующие уравнения:
\ [\ begin {split} \ begin {align}
р * д & = п \\
e * d & \ Equiv 1 (\ text {mod lcm} [(p-1) (q-1)]) \\
п * и & \ эквив 1 (\ текст {мод} д)
\ end {align} \ end {split} \]Параметры: Вызывает: ValueError
- когда импортируемый ключ не проходит самые простые проверки действительности RSA.Возвращает: ключевой объект RSA (
RsaKey
).
-
Крипто.Публичный ключ.RSA.
import_key
( extern_key , кодовая фраза = Нет ) Импортируйте ключ RSA (открытый или закрытый).
Параметры: - extern_key ( строка или строка байта ) -
Ключ RSA для импорта.
Для открытого ключа RSA поддерживаются следующие форматы :
- Сертификат X.509 (двоичный формат или формат PEM)
- X.509
subjectPublicKeyInfo
DER SEQUENCE (двоичный или PEM
кодировка) - PKCS # 1
RSAPublicKey
DER SEQUENCE (двоичная или PEM-кодировка) - Строка OpenSSH (например, содержимое
~ / .ssh / id_ecdsa
, ASCII)
Для закрытого ключа RSA поддерживаются следующие форматы :
- PKCS # 1
RSAPrivateKey
DER SEQUENCE (двоичное кодирование или кодирование PEM) - PKCS # 8
PrivateKeyInfo
илиEncryptedPrivateKeyInfo
DER SEQUENCE (двоичная кодировка или кодировка PEM) - OpenSSH (текстовый формат, представленный в OpenSSH 6.5)
Подробнее о кодировке PEM см. RFC1421 / RFC1423.
- парольная фраза ( строка или байтовая строка ) - только для закрытых ключей, парольная фраза, которая шифрует ключ.
Возвращает: ключевой объект RSA (
RsaKey
).Повышает: ValueError / IndexError / TypeError
- Когда данный ключ не может быть проанализирован (возможно, из-за
фраза неверна).- extern_key ( строка или строка байта ) -
- класс
Crypto.PublicKey.RSA.
RsaKey
( ** kwargs ) Класс, определяющий фактический ключ RSA.
Не создавайте экземпляры напрямую.
Вместо этого используйтеgenerate ()
,construct ()
илиimport_key ()
.Переменные: - n ( целое число ) - модуль RSA
- e ( целое число ) - публичная экспонента RSA
- d ( целое число ) - частный показатель RSA
- p ( целое число ) - Первый коэффициент модуля RSA
- q ( целое число ) - Второй коэффициент модуля RSA
- u - Китайский остаток (\ (p ^ {- 1} \ text {mod} q \))
-
exportKey
( формат = 'PEM' , пароль = нет , pkcs = 1 , защита = нет , randfunc = нет ) Экспортируйте этот ключ RSA.
Параметры: - формат ( строка ) -
Формат, используемый для переноса ключа:
- ’PEM’ . ( По умолчанию ) Кодировка текста в соответствии с RFC1421 / RFC1423.
- ’DER’ . Двоичное кодирование.
- ’OpenSSH’ . Текстовое кодирование в соответствии со спецификацией OpenSSH.
Подходит только для открытых ключей (не для закрытых ключей).
- парольная фраза ( строка ) - ( Только для закрытых ключей ) Парольная фраза, используемая для защиты вывода.
- pkcs ( целое число ) -
( Только для закрытых ключей ) Структура ASN.1, используемая для
сериализация ключа. Обратите внимание, что даже в случае PEM
кодирования существует внутренняя структура DER ASN.1.При
pkcs = 1
( по умолчанию ) закрытый ключ закодирован в
простая структура PKCS # 1 (RSAPrivateKey
).При
pkcs = 8
закрытый ключ закодирован в структуре PKCS # 8
(PrivateKeyInfo
).Примечание
Этот параметр игнорируется для открытого ключа.
Для DER и PEM - ASN.1 DERSubjectPublicKeyInfo
структура всегда используется. - защита ( строка ) -
( Только для закрытых ключей )
Схема шифрования, используемая для защиты закрытого ключа.Если
Нет
(по умолчанию), поведение зависит от формата- Для ‘DER’ , PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC
схема используется.Выполняются следующие операции:- 16-байтовый тройной ключ DES получен из ключевой фразы
используяCrypto.Protocol.KDF.PBKDF2 ()
с 8-байтовой солью,
и 1000 итерацийCrypto.Hash.HMAC
. - Закрытый ключ зашифрован с использованием CBC.
- Зашифрованный ключ закодирован в соответствии с PKCS # 8.
- 16-байтовый тройной ключ DES получен из ключевой фразы
- Для «PEM» используется устаревшая схема шифрования PEM.
Он основан на MD5 для получения ключей и Triple DES для шифрования.
Указание значения для защиты
(то естьpkcs = 8
), и только если присутствует парольная фраза.Поддерживаемые схемы для PKCS # 8 перечислены в
Модуль Crypto.IO.PKCS8
(см. Параметрwrap_algo
). - Для ‘DER’ , PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC
- randfunc ( вызываемый ) - функция, которая предоставляет случайные байты. Используется только для кодирования PEM.
По умолчанию -Crypto.Random.get_random_bytes ()
.
Возвращает: закодированный ключ
Тип возврата: байтовая строка
Повышает: ValueError
- когда формат неизвестен или когда вы пытаетесь зашифровать частный
ключ в формате DER и PKCS # 1.Предупреждение
Если вы не укажете парольную фразу, закрытый ключ будет
экспортируется в чистом виде!- формат ( строка ) -
-
export_key
( формат = 'PEM' , кодовая фраза = Нет , pkcs = 1 , защита = Нет , randfunc = Нет ) Экспортируйте этот ключ RSA.
Параметры: - формат ( строка ) -
Формат, используемый для переноса ключа:
- ’PEM’ . ( По умолчанию ) Кодировка текста в соответствии с RFC1421 / RFC1423.
- ’DER’ . Двоичное кодирование.
- ’OpenSSH’ . Текстовое кодирование в соответствии со спецификацией OpenSSH.
Подходит только для открытых ключей (не для закрытых ключей).
- парольная фраза ( строка ) - ( Только для закрытых ключей ) Парольная фраза, используемая для защиты вывода.
- pkcs ( целое число ) -
( Только для закрытых ключей ) Структура ASN.1, используемая для
сериализация ключа. Обратите внимание, что даже в случае PEM
кодирования существует внутренняя структура DER ASN.1.При
pkcs = 1
( по умолчанию ) закрытый ключ закодирован в
простая структура PKCS # 1 (RSAPrivateKey
).При
pkcs = 8
закрытый ключ закодирован в структуре PKCS # 8
(PrivateKeyInfo
).Примечание
Этот параметр игнорируется для открытого ключа.
Для DER и PEM - ASN.1 DERSubjectPublicKeyInfo
структура всегда используется. - защита ( строка ) -
( Только для закрытых ключей )
Схема шифрования, используемая для защиты закрытого ключа.Если
Нет
(по умолчанию), поведение зависит от формата- Для ‘DER’ , PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC
схема используется.Выполняются следующие операции:- 16-байтовый тройной ключ DES получен из ключевой фразы
используяCrypto.Protocol.KDF.PBKDF2 ()
с 8-байтовой солью,
и 1000 итерацийCrypto.Hash.HMAC
. - Закрытый ключ зашифрован с использованием CBC.
- Зашифрованный ключ закодирован в соответствии с PKCS # 8.
- 16-байтовый тройной ключ DES получен из ключевой фразы
- Для «PEM» используется устаревшая схема шифрования PEM.
Он основан на MD5 для получения ключей и Triple DES для шифрования.
Указание значения для защиты
(то естьpkcs = 8
), и только если присутствует парольная фраза.Поддерживаемые схемы для PKCS # 8 перечислены в
Модуль Crypto.IO.PKCS8
(см. Параметрwrap_algo
). - Для ‘DER’ , PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC
- randfunc ( вызываемый ) - функция, которая предоставляет случайные байты. Используется только для кодирования PEM.
По умолчанию -Crypto.Random.get_random_bytes ()
.
Возвращает: закодированный ключ
Тип возврата: байтовая строка
Повышает: ValueError
- когда формат неизвестен или когда вы пытаетесь зашифровать частный
ключ в формате DER и PKCS # 1.Предупреждение
Если вы не укажете парольную фразу, закрытый ключ будет
экспортируется в чистом виде!- формат ( строка ) -
-
has_private
() Является ли это закрытым ключом RSA
-
публичный ключ
() Соответствующий открытый ключ RSA.
-
size_in_bits
() Размер модуля RSA в битах
-
size_in_bytes
() Минимальное количество байтов, которое может содержать модуль RSA
-
Крипто.