В предыдущей статье мы рассматривали различные методы генерации закрытого ключа. Какой бы метод вы ни выбрали, в конце вы получите 32 байта данных. Вот ключ, который мы получили в конце той статьи:
60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2В этой статье мы будем использовать этот закрытый ключ для получения как открытого ключа, так и адреса для биткоин-кошелька.
Наша задача – применить серию преобразований к закрытому ключу, чтобы получить открытый ключ, а затем и адрес кошелька. Большинство этих преобразований называются хэш-функциями. Эти хэш-функции являются односторонними преобразованиями, которые нельзя отменить. Мы не будем вдаваться в механизм самих функций — по этому вопросу есть много замечательных статей. Вместо этого мы рассмотрим, как использование этих функций в правильном порядке может помочь вам сгенерировать адрес биткоин-кошелька, который вы впоследствии сможете использовать.
- Криптография с использованием эллиптической кривой
- Открытый ключ
- Сжатый открытый ключ
- Шифрование открытого ключа
- Добавление сетевого байта
- Контрольная сумма
- Получение адреса
- Вывод
- Ключи приватные и ключи публичные
- HD-кошельки
- Мнемонические seed-фразы
- Приватные ключи из “зерна”
- “Размножение” открытых ключей
- Сравнение приватного и публичного ключей на примере биткоина
- Что еще почитать
- Как работает протокол SSH
- Как создать ключи SSH?
- Добавление публичного ключа на удаленный сервер
- Как получить публичный SSH-ключ из приватного
- Как отключить проверку (требование) пароля при авторизации по SSH
Криптография с использованием эллиптической кривой
Применяя ECDSA к закрытому ключу, мы получаем 64-байтовое целое число. Оно состоит из двух 32-байтовых целых чисел, которые представляют соединенные вместе точки X и Y эллиптической кривой.
Для нашего примера мы получили:
На языке Python это будет выглядеть так:
private_key_bytes = codecs.decode(private_key, ‘hex’)# Get ECDSA public keykey = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1).verifying_keykey_bytes = key.to_string()key_hex = codecs.encode(key_bytes, ‘hex’)
Примечание: как видно из кода, прежде чем я использовал метод на базе модуля ECDSA, я расшифровал закрытый ключ, используя кодеки. Это больше относится к Python и меньше к самому алгоритму, но я объясню, что мы здесь делаем во избежание возможной путаницы.
В Python есть как минимум два класса, которые могут хранить закрытый и открытый ключи: “str” и “bytes”. Первый – это строка, а второй – массив байтов. Криптографические методы в Python работают с классом “bytes”, принимая его в качестве входных данных и возвращая как результат.
Теперь, есть маленькая загвоздка: строка, скажем, 4f3c не равна массиву байтов 4f3c, она равна массиву байтов с двумя элементами, O<. И вот тут как раз в дело вступает codecs.decode: этот метод преобразует строку в массив байтов. Все то же самое будет и для всех криптографических манипуляций, которые мы будем приводить в этой статье.
Открытый ключ
Как только мы закончили с ECDSA, все, что нам нужно сделать, это добавить байт 0x04 в начале нашего открытого ключа. В результате мы получаем полный открытый ключ биткоина, который выглядит следующим образом:
Сжатый открытый ключ
Но мы можем сделать лучше. Как вы помните, открытый ключ является некоторой точкой (X, Y) на кривой. Мы знаем кривую, и для каждого X есть только два Ys, которые определяют точку, которая лежит на этой кривой. Так зачем хранить Y? Вместо этого, давайте сохраним X и знак Y. Позже мы можем вернуть Y, если в этом будет необходимость.
Особенности заключаются в следующем: мы берем X из открытого ключа ECDSA. Теперь, мы добавим 0x02, если последний байт Y четный, и байт 0x03, если последний байт нечетный.
В нашем случае последний байт нечетный, поэтому мы добавляем 0x03, чтобы получить сжатый открытый ключ:
Этот ключ содержит ту же информацию, но он почти в два раза короче, чем несжатый ключ. Клево!
Раньше программное обеспечение кошельков использовало длинные, полные версии открытых ключей, но теперь большинство из них перешло на сжатые ключи.
Шифрование открытого ключа
Теперь нам нужно сгенерировать адрес кошелька. Какой бы метод генерирования открытого ключа вы ни выбрали, он проходит ту же процедуру. Очевидно, что адреса будут отличаться. В этой статье мы рассмотрим сжатую версию.
Здесь нам нужно применить SHA-256 к открытому ключу, а затем применить RIPEMD-160 к результату. Порядок очень важен.
SHA-256 и RIPEMD-160 являются двумя хэш-функциями, и опять же, мы не будем вдаваться в детали того, как они работают.
Важно то, что теперь у нас есть 160-битное целое число, которое будет использоваться для дальнейших модификаций. Назовем это зашифрованным открытым ключом. Для нашего примера, зашифрованный открытый ключ – это 453233600a96384bb8d73d400984117ac84d7e8b
Вот как мы шифруем открытый ключ в Python:
public_key_bytes = codecs.decode(public_key, ‘hex’)# Run SHA-256 for the public keysha256_bpk = hashlib.sha256(public_key_bytes)sha256_bpk_digest = sha256_bpk.digest()# Run RIPEMD-160 for the SHA-256ripemd160_bpk = hashlib.new(‘ripemd160’)ripemd160_bpk.update(sha256_bpk_digest)ripemd160_bpk_digest = ripemd160_bpk.digest()ripemd160_bpk_hex = codecs.encode(ripemd160_bpk_digest, ‘hex’)
Добавление сетевого байта
Биткоин имеет две сети, основную и тестовую. Основной сетью является сеть, которую все люди используют для перевода монет. Тестовая сеть была создана, как вы уже догадались, для тестирования новых функций и программного обеспечения.Мы хотим создать адрес для использования его в основной сети, поэтому нам нужно добавить 0x00 к зашифрованному открытому ключу. Результат 00453233600a96384bb8d73d400984117ac84d7e8b. Для тестовой сети это будет 0x6f.
Контрольная сумма
Теперь нам нужно рассчитать контрольную сумму для нашего ключа в основной сети. Идея контрольной суммы состоит в том, чтобы убедиться, что данные (в нашем случае, ключ) не были повреждены во время передачи. Программное обеспечение кошелька должно ориентироваться на контрольную сумму и отмечать адрес как недопустимый, если контрольная сумма не соответствует заявленной.
Чтобы вычислить контрольную сумму ключа, нам нужно применить SHA-256 дважды, а затем взять первые 4 байта результата. В нашем примере двойной SHA-256 — это 512f43c48517a75e58a7ec4c554ecd1a8f9603c891b46325006abf39c5c6b995, и поэтому контрольная сумма 512f43c4 (обратите внимание, что 4 байта составляют 8 шестнадцатеричных цифр).
С = SHA-256 (SHA-256 (зашифрованный открытый ключ основной сети))Контрольная сумма = первые 4 байта С
Для расчета контрольной суммы адреса используется следующий код:
Получение адреса
Наконец, чтобы получить адрес, мы просто объединяем ключ основной сети и контрольную сумму. В нашем случае это выглядит так: 00453233600a96384bb8d73d400984117ac84d7e8b512f43c4
Вот и все! Это адрес кошелька для закрытого ключа, приведенного в начале статьи.
Но вы можете заметить, что что-то не так. Вы, вероятно, уже встречали биткоин-адреса, и они не выглядели так. Ну, причина в том, что они кодируются с помощью Base58 (вариант кодирования цифрового кода в виде буквенно-цифрового текста на основе латинского алфавита. Алфавит кодирования содержит 58 символов). Это немного странно.
Вот алгоритм для преобразования шестнадцатеричного адреса в адрес Base58:
Мы получаем 17JsmEygbbEUEpvt4PFtYaTeSqfb9ki1F1, сжатый адрес биткоин-кошелька.
Шестнадцатеричный адрес = зашифрованный открытый ключ основной сети + адрес контрольной суммы = Base58 (Шестнадцатеричный адрес)
Вывод
Процесс генерации ключей кошелька можно разделить на четыре этапа:
- создание открытого ключа с помощью ECDSA
- шифрование ключа с помощью SHA-256 и RIPEMD-160
- кодирование ключа с помощью Base58.
В зависимости от формы открытого ключа (полный или сжатый), мы получаем разные адреса, но оба совершенно допустимы.
Вот полный алгоритм для несжатого открытого ключа:
Эллиптический открытый ключ = ECDSA (закрытый ключ)Открытый ключ = 0х04 + эллиптический открытый ключЗашифрованный открытый ключ = RIPEMD-160 (SHA-256 (открытый ключ))Зашифрованный открытый ключ основной сети = 0х00 + Зашифрованный открытый ключС = SHA-256 (SHA-256 (Зашифрованный открытый ключ основной сети))Контрольная сумма = первые 4 байта СШестнадцатеричный адрес = Зашифрованный открытый ключ основной сети + Контрольная суммаАдрес = Base58 (Шестнадцатеричный адрес)
Если вы хотите «поиграть» с кодом, я опубликовал его на GitHub.
Я делаю обзор о криптовалютах на Medium. Первая часть – подробное описание блокчейна.
Ключи приватные и ключи публичные
Для работы с любой криптовалютой используются пары из приватных и публичных ключей (также называемых закрытыми и открытыми).
Для обеспечения доступа к средствам на балансе кошелька и подписи исходящих транзакций используется приватный ключ. Потеряли его — потеряли свою криптовалюту. Закрытый ключ — это случайное число определенного размера. Так, для Ethereum — 256-битное.
Теоретически возможно подобрать это число и перевести монеты на какой-нибудь другой кошелек, но вероятность этого настолько низка, что “угадывающий” скорее умрет от старости, чем что-то заработает — вариантов ключей слишком много.
Открытый ключ — это адрес, который можно сообщить другим пользователям для того, чтобы они могли отправить на кошелек монеты. В блокчейнах эфириума, биткоина и подавляющего большинства других криптовалют, публичный ключ является результатом умножения по эллиптическим кривым закрытого ключа. При этом функция является односторонней, так что имея открытый ключ, вычислить закрытый невозможно.
HD-кошельки
Сегодня существуют два основных типа кошельков — недетерминированные и детерминированные.
Если недетерминированные кошельки просто создают ряд случайных пар закрытых и открытых ключей, то детерминированные выводят пары ключей из “зерна” (seed) — случайного числа определенного размера. Поскольку при такой схеме работы кошелька для создания резервной копии достаточно один раз скопировать “зерно”, упрощается и восстановление доступа к монетам, и “миграция” на другие устройства и платформы.
Большинство современных кошельков относятся к так называемым иерархически детерминированным (они же HD-кошельки). Они используют древообразную структуру в качестве “корня” которой служит зерно, а каждый полученный из него ключ имеет свои производные ключи. Благодаря возможности создания неограниченного числа открытых ключей даже без доступа к приватным ключам (храня их, например. на не подключенном к интернету носителе), такие кошельки значительно более безопасны.
При этом “зерно”, как правило, кодируется при помощи тех самых, интересующих нас мнемонических seed-фраз. Вдобавок, поскольку приватные и публичные ключи Ethereum и Bitcoin работают одинаково, разработчики кошельков для эфира не стали изобретать велосипед и использовали “предложения по улучшению биткоина” BIP32, BIP44 (описывающие создание иерархически детерминированных кошельков) и BIP39 (описывающий мнемонические фразы). Хотя в случае BIP39 многие “эфирные” кошельки используют другие наборы слов и хэш-функции, но сам механизм работы остается неизменным.
Мнемонические seed-фразы
Мнемоническая фраза — это последовательность слов, используемая для кодирования числа. Такую фразу гораздо проще запомнить, чем само число. Этой фразы достаточно для того, чтобы восстановить “зерно”, приватные ключи и кошелек целиком на любом устройстве при наличии совместимого ПО.
Процедура получения мнемонической фразы, согласно BIP39, выглядит следующим образом:
- Создается случайное число (энтропия). В случае Эфириума наиболее логично создание 256-битной энтропии. так как тогда безопасность seed-фразы будет соответствовать безопасности закрытого ключа Эфириума.
- Создается контрольная сумма энтропии. Для этого берется первая часть (в случае BIP39 — 1/32) битов ее хэш-суммы.
- В конец исходной энтропии добавляется полученная контрольная сумма.
- Полученная энтропия делится на части по 11 бит.
- Эти 11-битная числа служат индексами для таблицы, содержащей 2048 слов.
- В результате получается мнемоническая seed-фраза из 12-24 (24 в случае эфира) слов.
Другие механизмы создания мнемонических кодов работают аналогично, хотя могут иметь другие таблицы слов, использовать другие хэш-функции и другую часть битов полученной хэш-функции для получения контрольной суммы. Из-за этого seed-фразы некоторых кошельков несовместимы между собой.
Также, для удобства использования кошельков, таблицы слов должны соответствовать нескольким правилам:
- не использовать сходные слова. например “woman” и “women” — это усложняет запоминание и увеличивает вероятность ошибок;
- слова должны быть подобраны таким образом, чтобы узнать слово можно было по первым четырем буквам.
В ряде кошельков работа, можно сказать, начинается с “восстановления” кошелька. Пользователь (или генератор) создает seed-фразу из слов, указанных в таблице, которая декодируется в “зерно”.
Приватные ключи из “зерна”
Для создания закрытого мастер-ключа “зерно” обрабатывается с помощью хэш-функции HMAC-SHA512 (функция односторонняя). Результат — 512-битное число — делится на 2 части по 256 бит в каждой: собственно закрытый мастер-ключ (он же родительский закрытый ключ) и “код цепи”.
Дочерние ключи, в свою очередь, получаются из комбинации расширенного ключа (сочетание ключа и “кода цепи”) и 32-битного индекса (порядкового номера)с помощью все той же HMAC-SHA512. Результат разделяется на дочерние закрытый ключ и код цепи.
Размер индекса (32 бита) достаточен для создания 2 миллиардов дочерних ключей из каждого родительского. Затем процедуру можно повторить с полученным дочерним ключом, использовав его в качестве “родителя” нового поколения ключей. Ограничения на число поколений не существует — весь кошелек все равно можно будет восстановить из зерна.
“Размножение” открытых ключей
Помимо “традиционного” способа генерации — из приватных ключей — дочерние публичные ключи в HD-кошельке можно получить из родительского публичного ключа, используя процедуру, аналогичной приведенной выше. Только вместо расширенного закрытого ключа применяется расширенный открытый. Это позволяет создавать неограниченное число публичных ключей, даже не имея доступа к приватному ключу.
Благодаря этому можно хранить закрытый ключ на аппаратном кошельке без доступа к интернету или вообще на бумажном носителе и использовать только при подтверждении исходящих транзакций. Открытый же ключ можно хранить где угодно, хоть на онлайн-сервисе. Опасности потери средств с кошелька нет — закрытого ключа даже нет в сети.
Кроме того, данная возможность активно используется в работе коммерческих сервисов. Веб-сервер может создавать новый адрес для оплаты каждой покупки, но при этом не будет риска потери средств при взломе сервера — на нем попросту не будет закрытого ключа, который позволил бы перевести средства.
Приватный (закрытый) ключ по своей сути является сложной криптографической формой. Он позволяет пользователю получить доступ к своей криптовалюте. Закрытый ключ является неотъемлемой частью криптовалюты Bitcoin и остальных альткоинов. Благодаря ему, владелец криптовалютного кошелька защищен от потерь и несанкционированного доступа к своим средствам.
При работе с криптовалютами пользователь получает публичный адрес и приватный ключ для транзакций криптовалют или токенов. На публичном адресе владельца криптокошелька находятся полученные им средства, с которого он также может их отправить любому другому пользователю. Но даже если у пользователя есть токены, полученные на его адрес, он не сможет их использовать без уникального приватного ключа. Публичный (открытый) ключ создается из приватного ключа с помощью сложного математического алгоритма. Обратный процесс, создания приватного (закрытого) ключа из публичного практически невозможен.
Приватный ключ может принимать несколько различных форм, но зачастую выглядит, как последовательность буквенно-цифровых символов. Такой подход затрудняет взлом криптовалютного кошелька хакерами. Важно хранить приватный ключ в безопасности, иначе доступ в ваш криптокошелек может быть скомпрометирован.
Кошелек пользователя хранит закрытый ключ. Когда в нем создается транзакция, программное обеспечение кошелька создает цифровую подпись, обрабатывая транзакцию с использованием закрытого ключа. Данный алгоритм защищает систему, поскольку единственным способом генерации значения цифровой подписи для любой перевода является использование приватного ключа. Подпись используется для подтверждения транзакции. Иными словами она гарантирует, что после совершения транзакции она не может быть отменена, а средства получены от конкретного пользователя. Если в транзакции произойдут изменения, то подпись к этой транзакции также изменится.
При потере пользователем приватного ключа от своего кошелька, доступ к нему для совершения транзакций будет безвозвратно потерян. Поэтому к безопасному хранению приватного ключа необходимо подойти максимально ответственно. Для сохранности закрытого ключа есть несколько проверенных и надежных способов.
- Приватные ключи можно хранить используя бумажный кошелек. Это текст на бумаге или QR-код, используемые для подписи транзакции, когда это потребуется.
- Использование аппаратного кошелька для хранения приватного ключа. Он применяет USB-устройство для создания и защиты приватного ключа оффлайн.
- Для хранения приватного ключа также используется десктопный кошелек. В нем закрытый ключ хранится в файле, а когда требуется подписать транзакцию, он загружается на ПК и выполняет свою функцию.
Такие способы хранения приватных ключей называют холодными хранилищами, поскольку ключи хранятся без интернет-доступа с к ним. Есть еще так называемые горячие криптовалютные кошельки, они хранят закрытые ключи на устройствах или системах, подключенных к всемирной паутине.
Сравнение приватного и публичного ключей на примере биткоина
Что еще почитать
My answer below is a bit lengthy, but hopefully it provides some details that are missing in previous answers. I’ll start with some related statements and finally answer the initial question.
To encrypt something using RSA algorithm you need modulus and encryption (public) exponent pair (n, e). That’s your public key. To decrypt something using RSA algorithm you need modulus and decryption (private) exponent pair (n, d). That’s your private key.
To encrypt something using RSA public key you treat your plaintext as a number and raise it to the power of e modulus n:
ciphertext = ( plaintext^e ) mod n
To decrypt something using RSA private key you treat your ciphertext as a number and raise it to the power of d modulus n:
plaintext = ( ciphertext^d ) mod n
openssl rsa -in private.pem -out public.pem -pubout
Shouldn’t private key consist of (n, d) pair only? Why are there 6 extra components? It contains e (public exponent) so that public RSA key can be generated/extracted/derived from the private.pem private RSA key. The rest 5 components are there to speed up the decryption process. It turns out that by pre-computing and storing those 5 values it is possible to speed the RSA decryption by the factor of 4. Decryption will work without those 5 components, but it can be done faster if you have them handy. The speeding up algorithm is based on the Chinese Remainder Theorem.
This structure of the RSA private key is recommended by the PKCS#1 v1.5 as an alternative (second) representation. PKCS#1 v2.0 standard excludes e and d exponents from the alternative representation altogether. PKCS#1 v2.1 and v2.2 propose further changes to the alternative representation, by optionally including more CRT-related components.
openssl rsa -in public.pem -text -pubin -noout
Modulus — n
Exponent (public) — e
No surprises here. It’s just (n, e) pair, as promised.
Now finally answering the initial question: As was shown above private RSA key generated using openssl contains components of both public and private keys and some more. When you generate/extract/derive public key from the private key, openssl copies two of those components (e,n) into a separate file which becomes your public key.
Edit: question has been edited, it was originally RSA-only. For other asymmetric algorithm, there is no requirement that the public key may be derived from the private key, nor is there any requirement of the contrary. For discrete logarithm-based algorithms (Diffie-Hellman, El-Gamal, DSA, and the elliptic curve variants of all of these), the public key is easily computed from the private key. It is possible to conceive a degenerate RSA in which knowledge of the private key does not allow reconstruction of the public key, but this requires not storing a few key elements which are needed for good performance (in full details, storing the RSA modulus factors allows for a 4x speed enhancement through the Chinese Remainder Theorem, so everybody stores the factors). On a more conceptual basis, the public key is, well, public, so it is assumed that «everybody» knows it; in practical terms, private key storage format almost always include provisions for storing the public key as well, or at least sufficient data to rebuild the public key.
SSH или Secure Shell — это зашифрованный протокол, который часто используется для взаимодействия и удаленного управления серверами. Если вы захотите что-либо сделать на удаленном сервере, скорее всего, вам придется воспользоваться SSH и работать через терминал.
В SSH существует несколько способов авторизации. Вы можете каждый раз вводить пароль пользователя или использовать более безопасный и надежный способ — ключи SSH. Что самое интересное, он более удобен для применения, вам даже не нужно будет вводить пароль. В этой статье мы рассмотрим как настраивается авторизация по ключу SSH.
Как работает протокол SSH
SSH сервер может выполнять аутентификацию пользователей с помощью различных алгоритмов. Самый популярный — это аутентификация по паролю. Он достаточно прост, но не очень безопасный. Пароли передаются по безопасному каналу, но они недостаточно сложны для противостояния попыткам перебора.
Публичный ключ используется для шифрования сообщений (он не является секретным), которые можно расшифровать только приватным ключом. Это свойство и используется для аутентификации с помощью пары ключей. Публичный ключ загружается на удаленный сервер, к которому необходимо получить доступ. Его нужно добавить в специальный файл ~/.ssh/authorized_keys.
Проверка подлинности ключей
Когда клиент попытается выполнить проверку подлинности через этот ключ, сервер отправит сообщение, зашифрованное с помощью публичного ключа, если клиент сможет его расшифровать и вернуть правильный ответ — аутентификация пройдена.
Как создать ключи SSH?
Для генерации пары ключей используется программа ssh-keygen, она включена в пакет ssh и если SSH у вас уже настроен, то дополнительно устанавливать ничего не нужно.
По умолчанию ключи располагаются в папке ~/.ssh/. И лучше расположение этой папки не менять, чтобы все работало по умолчанию и ключи автоматически подхватывались. Приватный ключ будет называться id_rsa, а публичный id_rsa.pub.
Сгенерим ключ через команду:
$ ssh-keygen -t rsa
При выполнении команды у нас спрашивают имя файла, не нужно ничего вводить, будет использовано имя по умолчанию. Также спрашивается пароль. Этот пароль позволяет установить дополнительную защиту — при подключении с помощью ключей не будет спрашиваться пароль пользователя, но будет спрашиваться пароль самого ключа. Устанавливать пароль необязательно. Но надо учитывать следующие, использование дополнительного шифрования имеет только один минус — необходимость вводить пароль, и несколько преимуществ:
- Пароль никогда не попадет в сеть, он используется только на локальной машине для расшифровки ключа. Это значит что перебор по паролю больше невозможен.
- Секретный ключ хранится в закрытом каталоге и у клиента ssh нет к нему доступа пока вы не введете пароль;
- Если злоумышленник хочет взломать аутентификацию по ключу SSH, ему понадобится доступ к вашей системе. И даже тогда ключевая фраза может стать серьезной помехой на его пути.
В результате будет создано два файла: ~/.ssh/id_rsa и ~/.ssh/id_rsa.pub
Первый файл id_rsa (это приватный ключ) всегда нужно хранить в секрете. Второй файл id_rsa.pub (это публичный ключ) нужно добавить на удалённый компьютер, где запущен сервер SSH.
Добавление публичного ключа на удаленный сервер
На удалённой машине нам нужно создать каталог .ssh. Далее нам нужно скопировать содержимое файла публичного ключа id_rsa.pub на удалённую машину в файл ~/.ssh/authorized_keys.
Обратите внимание, права на файл не должны давать возможность писать в этот файл посторонним пользователям, иначе SSH его не примет.
Теперь можно выполнять подключение с помощью клиента SSH на удаленный сервер. Для это выполним команду:
Первый раз, когда вы заходите на сервер,SSH вас спрашивает, доверяете ли вы ключу. Если отвечаете нет, соединение закрывается. Если да — ключ сохраняется в файл ~/.ssh/known_hosts. Узнать, где какой ключ нельзя (ибо считается что это небезопасно).
Если ключ сервера поменялся (например, сервер переустановили), SSH вопит от подделке ключа. Обратите внимание, если сервер не трогали, а SSH вопит, значит вы не на тот сервер ломитесь (например, в сети появился ещё один компьютер с тем же IP, особо этим страдают всякие локальные сети с 192.168.1.1, которых в мире несколько миллионов).
- Ключ сервера хранится в /etc/ssh/ssh_host_rsa_key и /etc/ssh/ssh_host_rsa_key.pub. Их можно:скопировать со старого сервера на новый.
- сгенерировать с помощью ssh-keygen. Пароля при этом задавать не надо (т.е. пустой). Ключ с паролем ssh-сервер использовать не сможет.
Старые ключи из know_hosts при этом лучше убрать, иначе ssh будет ругаться на duplicate key.
Как получить публичный SSH-ключ из приватного
Чтобы из файла с закрытым SSH-ключем сгенерировать и вывести на экран открытый ключ, воспользуйтесь следующей командой:
В качестве примера сгенерируем открытый SSH-ключ из закрытого ключа ~/.ssh/id_rsa и сохраним его в файл ~/.ssh/id_rsa.pub:
Как отключить проверку (требование) пароля при авторизации по SSH
Если пароль больше не будет использоваться, то для увеличения безопасности системы лучше его вовсе отключить. Но убедитесь, что ключ надежно сохранен и вы его не потеряете, потому что по паролю вы больше не войдете. Авторизуйтесь на сервере, затем откройте конфигурационный файл /etc/ssh/sshd_config и найдите там директиву PasswordAuthenticatin. Нужно установить ее значение в No:
$ sudo vi /etc/ssh/sshd_config
Теперь сохраните файл и перезапустите службу ssh:
$ sudo service ssh restart
Дальше будет возможно только подключение по ключу ssh, пароль не будет приниматься.
Еще по теме
Онлайн справочник по командам linux с примерами