<?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