php - 如何在 PHP 中将 DSA 公钥从 OpenSSL 格式转换为 OpenSSH 格式?

标签 php openssl public-key openssh dsa

我一直在我的应用程序中使用 RSA key 。我使用以下代码将 RSA key 从 OpenSSL 格式转换为 OpenSSH 格式。它非常适用于 RSA key 。现在我想支持 DSA key 。但我的转换代码不适用于 DSA key 。我需要做哪些修改才能使用 DSA key ?

$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 key 的定义与 rsa key 的定义根本不同。没有“指数”(您使用 $keyInfo['rsa']['e'] 访问的数字,也没有 n。 因为您的代码解析 key 并对其重新编码,所以使用 dsa key 不会成功。相反,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);
}

当然,你的代码应该决定它是哪种类型的 key ,但我想我可以把它留给你。

另请注意,PHP 具有函数 openssl_pkey_get_public ,哪个更合适。我用它来测试上面的代码(我只是将你的前 4 行替换为 $public_key = sshEncodePublicKey(openssl_pkey_get_public('file://ssl.pub'));

关于php - 如何在 PHP 中将 DSA 公钥从 OpenSSL 格式转换为 OpenSSH 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37606189/

相关文章:

google-chrome - 主题备用名称丢失 & ERR_SSL_VERSION_OR_CIPHER_MISMATCH

apache - SVN 和 SSL 握手失败

encryption - Java - 如何修复 InvalidKeyException : Wrong algorithm type - RSA

php - 在其他页面访问MySQL连接语句

PHP session 变量未传递到下一页

php - PHP页面返回垃圾,而不是Objective-C中的返回字符串

openssl - 生成私钥和公钥 OpenSSL

php - Yii 2 基本模板中的多个用户

safari - 使用 openssl 为 Safari 推送通知手动签署推送包

ssl - 如何使用我的 https 公钥证书签署消息?