簡體   English   中英

如何在PHP中將DSA公鑰從OpenSSL轉換為OpenSSH格式?

[英]How can I convert DSA public key from OpenSSL to OpenSSH format in 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);
}

dsa密鑰的定義與rsa密鑰的定義根本不同。 沒有'exponent'(您使用$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函數,更適合。 我用它來測試上面的代碼(我只是用$public_key = sshEncodePublicKey(openssl_pkey_get_public('file://ssl.pub'));替換你的前4行$public_key = sshEncodePublicKey(openssl_pkey_get_public('file://ssl.pub'));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM