Как я могу преобразовать открытый ключ DSA из OpenSSL в формат OpenSSH в PHP?

Я использовал ключи RSA с в моем приложении. Я использовал следующий код для преобразования ключа RSA из OpenSSL в формат OpenSSH. Он отлично работал для ключа RSA. Теперь я хочу поддерживать ключи DSA. Но мой код преобразования не работает для ключей DSA. Какая модификация мне нужна, чтобы она работала с ключами DSA?

$private_key = openssl_pkey_get_private($rsaKey);
$public_key  = sshEncodePublicKey($private_key);

echo "RSA public key in OpenSSH format:\n$pubKey\n\n";

function sshEncodePublicKey($privKey)
{
$keyInfo = openssl_pkey_get_details($privKey);

$buffer  = pack("N", 7) . "ssh-rsa" .
sshEncodeBuffer($keyInfo['rsa']['e']) .
sshEncodeBuffer($keyInfo['rsa']['n']);

return "ssh-rsa " . base64_encode($buffer);
}

function sshEncodeBuffer($buffer)
{
$len = strlen($buffer);
if (ord($buffer[0]) & 0x80) {
$len++;
$buffer = "\x00" . $buffer;
}

return pack("Na*", $len, $buffer);
}

3

Решение

Определение ключа dsa принципиально отличается от определения ключей rsa. Не существует «экспоненты» (номера, к которому вы обращаетесь $keyInfo['rsa']['e'] и нет n,
Поскольку ваш код анализирует ключ и повторно его кодирует, это не удастся с ключами dsa. Вместо, openssl_pkey_get_details дает вам совершенно другой массив элементов, как указано в руководство.

Чтобы преобразовать это, используйте следующий код:

function sshEncodePublicKey($privKey)
{
$keyInfo = openssl_pkey_get_details($privKey);

$buffer  = pack("N", 7) . "ssh-dss" .
sshEncodeBuffer($keyInfo['dsa']['p']) .
sshEncodeBuffer($keyInfo['dsa']['q']) .
sshEncodeBuffer($keyInfo['dsa']['g']) .
sshEncodeBuffer($keyInfo['dsa']['pub_key']);

return "ssh-dss " . base64_encode($buffer);
}

Конечно, ваш код должен решить, какой это тип ключа, но я думаю, что могу оставить это вам.

Также обратите внимание, что PHP имеет функцию openssl_pkey_get_public, который более подходит. Я использовал это для проверки приведенного выше кода (я просто заменил ваши первые 4 строки на $public_key = sshEncodePublicKey(openssl_pkey_get_public('file://ssl.pub'));

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]