Назад | Перейти на главную страницу

Ключи SSH: почему id_rsa больше id_rsa.pub?

Мой закрытый ключ (~/.ssh/id_rsa) - это файл размером 1766 байт, но мой открытый ключ (~/.ssh/id_rsa.pub) имеет длину всего 396 байт. Почему такая огромная разница? Это потому, что закрытый ключ зашифрован с использованием AES? Разве зашифрованный текст AES обычно не такой же длины, как и открытый текст?

Ваш закрытый ключ содержит больше информации, чем ваш открытый ключ. В то время как открытый ключ передает только показатель шифрования (e) и модуль (n), закрытый ключ дополнительно включает показатель расшифровки (d) и два простых множителя (p и q) модуля. Закрытый ключ, по сути, имеет внутри открытый ключ.

[Шифрование: ciphertext = message ^ e (mod n); Расшифровка: сообщение = зашифрованный текст ^ d (mod n)]

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

$ openssl rsa -in id_rsa -text -noout

Изменить: файл закрытого ключа, по-видимому, не имеет показателя шифрования, но у него есть показатели d_1 и d_2, где d_1 = d (mod p-1) и d_2 = d (mod q-1). Они используются для ускорения дешифрования - вы можете разделить возведение в степень расшифровки на более мелкие вызовы параллельного возведения в степень, что в конечном итоге будет быстрее, чем один большой m = c ^ d (mod n) для больших d и больших n.

К сожалению, вы не указали, в каком формате хранятся ключи. Я думаю, вы имеете в виду кодировку ключей OpenSSH. В этом формате ключи хранятся в блоках данных в кодировке base64. В зависимости от кодировки при шифровании обычно используется какое-то заполнение при шифровании данных. Таким образом, полученные данные кратны размеру блока шифрования.

Ключи OpenSSH также могут включать какие-то комментарии и дополнительные свойства, вставленные между ---- BEGIN SSH2 [PUBLIC|PRIVATE] KEY ---- и -----END RSA [PUBLIC|PRIVATE] KEY----- маркеры. Видеть RFC4716.

Более того, для открытого ключа сохраняется модуль и открытый показатель степени, а для закрытого ключа сохраняется закрытый показатель. Видеть Генерация ключей RSA в Википедии подробнее о математической базе. В Интернете есть много мест, где описывается математическая связь между этими ключами. Не уверен, нужна ли вам здесь копия этого объяснения.

Теоретически можно вычислить закрытый ключ из информации об открытом ключе, но сделать это математически намного сложнее, чем наоборот. Просто рассматривайте закрытый ключ как «источник», который включает все переменные, а открытый ключ - как результат вычислений. Легко выполнять вычисления снова и снова, если вы знаете все переменные, но, зная только результат, трудно получить все исходные переменные. Это также причина, по которой вам достаточно сохранить закрытый ключ в надежном месте. Вы всегда можете использовать закрытый ключ для повторного вычисления открытого ключа. Но не наоборот - что ж, теоретически вы можете это сделать, но в зависимости от длины ключа это может занять много лет;).