我一直在我的应用程序中使用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);
}

最佳答案

dsa密钥的定义与rsa密钥的定义有本质的不同。这里没有“指数”(你用$keyInfo['rsa']['e']n访问的数字)。
因为您的代码解析密钥并重新编码它,所以在使用dsa密钥时不会成功。相反,openssl_pkey_get_details提供了一个完全不同的元素数组,如the manual中所指定的。
要对此进行转换,请使用以下代码:

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,这更适合。我用这个来测试上面的代码(我只是用$public_key = sshEncodePublicKey(openssl_pkey_get_public('file://ssl.pub'));替换了前面的4行)

10-08 02:05