【问题标题】:How can I convert DSA public key from OpenSSL to OpenSSH format in PHP?如何在 PHP 中将 DSA 公钥从 OpenSSL 转换为 OpenSSH 格式?
【发布时间】:2016-10-03 00:52:52
【问题描述】:

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

【问题讨论】:

    标签: php openssl public-key openssh dsa


    【解决方案1】:

    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行

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 2019-05-22
      • 2018-08-15
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      相关资源
      最近更新 更多