使用openssl_pkey_new()生成RSA密钥对

<?php
$config = [
    'digest_alg' => 'sha512',
    'default_md' => 'sha512',
    'private_key_bits' => 2048, // 必须为1024的整数倍,如:1024、2048、4096,值越大安全性越高,但缺点是性能也越低
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
];
$rsa = openssl_pkey_new($config);

// 获取私钥
openssl_pkey_export($rsa, $private);

// 获取公钥
$public = (array)openssl_pkey_get_details($rsa);
$public = $public['key'];

// 加密算法使用的填充方案
$padding = OPENSSL_PKCS1_OAEP_PADDING; // OPENSSL_PKCS1_OAEP_PADDING = 4: int

// 签名算法(签名和验签必须使用相同的算法)
$algorithm = OPENSSL_ALGO_SHA512; // OPENSSL_ALGO_SHA512 = 9: int
// 常用的算法如下:
// OPENSSL_ALGO_SHA1   = 1
// OPENSSL_ALGO_MD5    = 2
// OPENSSL_ALGO_MD4    = 3
// OPENSSL_ALGO_MD2    = 4
// OPENSSL_ALGO_DSS1   = 5
// OPENSSL_ALGO_SHA224 = 6
// OPENSSL_ALGO_SHA256 = 7
// OPENSSL_ALGO_SHA384 = 8
// OPENSSL_ALGO_SHA512 = 9
// OPENSSL_ALGO_RMD160 = 10

echo "公钥:$public" . PHP_EOL;
echo "私钥:$private" . PHP_EOL;

// 把公钥和私钥保存到文本文件
// file_put_contents(__DIR__ . '/public.key', $public);
// file_put_contents(__DIR__ . '/private.key', $private);

$message = 'PHP是世界上最好の语言';
echo "原文:$message" . PHP_EOL;

// 公钥加密
openssl_public_encrypt($message, $encrypted, $public, $padding);
echo '密文:' . base64_encode($encrypted) . PHP_EOL;

// 私钥解密
openssl_private_decrypt($encrypted, $decrypted, $private, $padding);
echo '解密:' . $decrypted . PHP_EOL;

// 私钥签名
openssl_sign($message, $sign, $private, $algorithm);
echo '签名:' . base64_encode($sign) . PHP_EOL;

// 公钥验签
$verify = openssl_verify($message, $sign, $public, $algorithm);
echo '验签:' . ($verify === 1 ? '合法' : '非法');

//========== 输出结果 ==========//
// 公钥:-----BEGIN PUBLIC KEY----- …… -----END PUBLIC KEY-----
// 私钥:-----BEGIN PRIVATE KEY----- …… -----END PRIVATE KEY-----
// 原文:PHP是世界上最好の语言
// 密文:T/FFsdyjvh4xmbglm6ud32fsobQgWIfjSiIxW4LGIqIk/6J9C8OOhl……
// 解密:PHP是世界上最好の语言
// 签名:bx+JES9sBsVMm8Q+KOEKLcKqGt1561v6ModZ9e9zJWyVNNIrjZtccB……
// 验签:合法

//========== 总结 ==========//
// 1、每次获取的公钥和私钥都是不同的,所以必须将两者保存到文本文件,需要使用时再从文本文件读出。

Copyright © 2024 码农人生. All Rights Reserved