ECC加密算法利用私钥算出公钥

问题描述

已知ECC的私钥内容,如下:

1
MHQCAQEEIIEkuYgeJcJR2P1cwdG8cY3kwj/3YiU+XwQd2uEgCyoooAcGBSuBBAAKoUQDQgAEVzHUGgk4iVYbdwiWudUf30+bP3cj7a4w2Tbl6jdfduprDTwj5nmxNziK7AcMDQcETf+gLjqkHK+JRMHzFGYouA==

使用PHP代码推算出对应的公钥。

计算过程

下面代码需要php版本7.1以上

  1. 转换ECC私钥内容为PEM格式

    1
    2
    3
    4
    5
    $private = 'MHQCAQEEIIEku...FGYouA=='; // ECC私钥内容
    $startLine = "-----BEGIN EC PRIVATE KEY-----\n"; // PEM起始行
    $endLine = "\n-----END EC PRIVATE KEY-----"; // PEM结束行
    $privKey = $startLine . implode("\n", str_split($private, 64)) . $endLine; // 内容每64个字符一行
    $privRes = openssl_pkey_get_private($privKey); // 转换私钥内容为资源
  2. 转换私钥资源到CSR

    1
    2
    3
    4
    5
    6
    $dn = [];
    $config = [
    'private_key_type' => OPENSSL_KEYTYPE_EC,
    'curve_name' => 'secp256k1', // 私钥生成时使用secp256k1曲线生成(需要设置与私钥生成对应的曲线)
    ];
    $csr = openssl_csr_new($dn, $privRes, $config);
  3. 从CSR中获取公钥

    1
    $pubKey = openssl_pkey_get_details(openssl_csr_get_public_key($csr))['key']; // 得到PEM格式的公钥内容
  4. 从PEM格式的公钥中获取字符串内容

    1
    2
    3
    4
    5
    6
    $replace = [
    '-----BEGIN PUBLIC KEY-----',
    '-----END PUBLIC KEY-----',
    "\n",
    ];
    $ripePublic = trim(str_replace($replace, '', $public)); // 得到处理后的公钥内容