我该如何在PHP中将OpenSSL的DSA公钥转换为OpenSSH格式?

3

我在我的应用程序中使用了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);
}
1个回答

2
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'));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接