init: 项目初始代码

This commit is contained in:
2026-10-14 14:00:29 +08:00
commit cc434cf89f
464 changed files with 66984 additions and 0 deletions

292
extend/encryption/Rsa.php Normal file
View File

@@ -0,0 +1,292 @@
<?php
namespace encryption;
class Rsa
{
const SIGN_CERT_PWD = '123456'; // 签名证书密码
private $public_key; // 公钥
private $private_key; // 私钥
private $cert_save_path = ''; // 证书文件保存目录
private $openssl_cnf_path = '/etc/ssl/openssl.cnf';
protected static $rsa;
/**
* 设私有构造方法防止对象被new
*/
private function __construct($config)
{
if ($config['public'] && $config['private']) {
if (is_file($config['public'])) {
$this->public_key = $this->getPublicKey($config['public']);
} else {
$this->public_key = openssl_pkey_get_public($config['public']);
if (!$this->public_key) {
die('请检查公钥是否正确');
}
}
if (is_file($config['private'])) {
$this->private_key = $this->getPrivateKey($config['private']);
} else {
$this->private_key = openssl_pkey_get_private($config['private']);
if (!$this->private_key) {
die('请检查私钥是否正确');
}
}
}
if ($config['cert_save_path']) $this->cert_save_path = $config['cert_save_path'];
}
/**
* 单例获取对象实例
*/
public static function instance($config=array())
{
if (!self::$rsa) {
if (empty($config)) {
$config = [
'public' => '',
'private' => '',
'cert_save_path' => ''
];
}
self::$rsa = new self($config);
}
return self::$rsa;
}
/**
* 读取文件
*/
private function fileGet($file)
{
if (!file_exists($file)) {
die($file . "不是文件");
}
return file_get_contents($file);
}
/**
* 获取公钥
*/
private function getPublicKey($path)
{
$pubKey = $this->fileGet($path);
if (!$pubKey) {
die('请检查公钥路径是否正确');
}
return openssl_pkey_get_public($pubKey);
}
/**
* 获取私钥
*/
private function getPrivateKey($path)
{
$priKey = $this->fileGet($path);
if (!$priKey) {
die('请检查私钥路径是否正确');
}
return openssl_pkey_get_private($priKey);
}
/**
* 使用私钥生成签名
* @param string 用于生成签名的字符串
* @return string 签名后的值
*/
public function signPrivate($data)
{
$signature = false;
if (openssl_sign($data, $signature, $this->private_key)) {
$signature = base64_encode($signature);
}
return $signature;
}
/**
* 使用公钥验签
* @param $data = array('data'='','signature'='')
* @return bool
*/
public function verifyPublic($data)
{
$bool = false;
if (!$data['data'] || !$data['signature']) {
die('数据源或签名值为出错!');
}
$result = base64_decode($data['signature']);
switch (openssl_verify($data['data'], $result, $this->public_key)) {
case 1:
$bool = true;
break;
case 0:
case -1:
$bool = false;
break;
default:
$bool = false;
}
return $bool;
}
/**
* 使用公钥加密
*/
public function encryptPublic($data)
{
$crypted = false;
if (is_array($data)) {
$data = json_encode($data);
}
$cryp = strrev($data); // 将数据前后反转再加密
if (openssl_public_encrypt($cryp, $crypted, $this->public_key, OPENSSL_PKCS1_PADDING)) {
$crypted = base64_encode($crypted);
}
return $crypted;
}
/**
* 使用公钥分块加密
*/
public function chunkEncryptPublic($data, $limit = 117)
{
if (is_array($data)) {
$data = json_encode($data);
}
$datas = str_split($data, $limit);
$crypteds = [];
foreach ($datas as $key => $val) {
$crypteds[$key] = $this->encryptPublic($val);
}
return $crypteds;
}
/**
* 使用私钥解密
*/
public function decryptPrivate($encrypted)
{
$decrypted = '';
$data = base64_decode($encrypted);
if (openssl_private_decrypt($data, $decrypted, $this->private_key, OPENSSL_PKCS1_PADDING)) {
$decrypted = rtrim(strrev($decrypted), '\0');
}
return $decrypted;
}
/**
* 使用私钥分块解密
*/
public function chunkDecryptPrivate($encrypteds)
{
$decrypted = '';
$encrypteds = htmlspecialchars_decode($encrypteds);
if (!is_array($encrypteds)) {
$arr = explode(',', $encrypteds);
if ($arr) {
$encrypteds = $arr;
} else {
return json_decode($this->decryptPrivate($encrypteds));
}
}
foreach ($encrypteds as $key => $val) {
$decrypted .= $this->decryptPrivate($val);
}
$res = json_decode($decrypted, true);
if (is_array($res)) return $res;
return json_decode($res, true);
}
/**
* 生成公私钥
*/
public function createRsa($writeFile=false)
{
$config = array("config" => $this->openssl_cnf_path);
// 生成公私钥
$privkey = openssl_pkey_new($config);
openssl_pkey_export($privkey, $private_key, null, $config); // 导出私钥$private_key
$public_key = openssl_pkey_get_details($privkey); // 导出公钥$public_key
if (!$writeFile) {
return array('private_key' => $private_key, 'public_key' => $public_key['key']);
}
$publicPath = $this->cert_save_path . "rsa_public_key.pem"; // 生成公钥路径
$privatePath = $this->cert_save_path . "rsa_private_key.pem"; // 私钥文件路径
// 生成公钥文件
if (!is_writeable($publicPath)) {
chmod($publicPath, 0755);
}
$fp = fopen($publicPath, "w");
fwrite($fp, $public_key['key']);
fclose($fp);
// 生成私钥文件
if (!is_writeable($privatePath)) {
chmod($privatePath, 0755);
}
$fp = fopen($privatePath, "w");
fwrite($fp, $private_key);
fclose($fp);
}
/**
* 生成证书和密钥
*/
public function createCsr($writeFile=false)
{
$dn = array(
"countryName" => 'CN', // 所在国家名称
"stateOrProvinceName" => 'Hunan', // 所在省份名称
"localityName" => 'Changsha', // 所在城市名称
"organizationName" => 'opd', // 注册人姓名
"organizationalUnitName" => 'orico_opd', // 组织名称
"commonName" => 'orico_opd', // 公共名称
"emailAddress" => '735273025@qq.com' // 邮箱
);
$privkeypass = self::SIGN_CERT_PWD; //私钥密码
$config = array(
"config" => $this->openssl_cnf_path,
"digest_alg" => "sha1",
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_DSA,
"encrypt_key" => false
);
$privkey = openssl_pkey_new($config);
$csr = openssl_csr_new($dn, $privkey, $config);
$sscert = openssl_csr_sign($csr, null, $privkey, 365, $config);
openssl_x509_export($sscert, $csrkey); // 导出证书$csrkey 
openssl_pkcs12_export($sscert, $private_key, $privkey, $privkeypass); // 导出密钥$private_key 
if (!$writeFile) {
return array('csrkey' => $csrkey, 'private_key_pfx' => $private_key);
}
$cerpath = $this->cert_save_path . "csrkey.cer"; // 生成证书路径
$pfxpath = $this->cert_save_path . "private_key.pfx"; // 密钥文件路径
// 生成证书文件
if (!is_writeable($cerpath)) {
chmod($cerpath, 0755);
}
$fp = fopen($cerpath, "w");
fwrite($fp, $csrkey);
fclose($fp);
// 生成密钥文件
if (!is_writeable($pfxpath)) {
chmod($pfxpath, 0755);
}
$fp = fopen($pfxpath, "w");
fwrite($fp, $private_key);
fclose($fp);
}
}

View File

View File

View File

@@ -0,0 +1,3 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCb4X1wN9ret271gWrsXlSymFinlheMUz2kIsyKREtlfE7ajH6Bm5bEFxe/HnCDxh37ekUJq4JMeU1awJgYA4mlvaQ67DSf4/AZWk2Dg8TLQaE7VeBJoPadDyciIwuFhcWB2lfD62KRlbXqgjfji7IjZE4ysVB99DofpJ9c9xd0NtzzuBNjgxh+f6BsegsIkqLIpKGIONePrY9cCj+vOMaRdUgWczQOftWXtJXiRz5kUxwV6CSQQbbPFEySStlW2WMBF15FyeOTXERvpgOoP4O+j/0GMW3R+4dKUxFY+SPrmMMB6HmJgySgCIVuwlUJyLlmhZuaIumryyJ19Yc+jB0ZAgMBAAECggEAA82hoN5MAckZ9PV+ZVv71wuuhhA8bNkPFPUgZnM6H7TDu8NXxtPD/u7NToVwm1Z3Hs6h5pV/rVv8Ti2KyHM1pYyV+DYRJqGKFyRD5eSOJaNpSqhSu5koyzY2bzfJrS1RX1SzdX1Fv2WWta0NrgiXhROKcOQwoZIW5PTASqVgth4iztEmseuU9pgh/dnMOXCLGmGB26Z2HTnuV0tHC4/goMmsi0eGOy40VEBxPL0JJegWM+teRSbSWGzOfTu95wnpIr66FT0aOVdHVuhMTYYHUfbEh/lnCZExfqjNfEVuSLB+jHBeLfFXdg3TY/svVizXJ4SvzI1EzM6Y145zMTdk8QKBgQDPKT1BQHWIPyXs3IzqDpmP9koBOm03rZZ46CneGLFj9vRAeK9awAto6aqH/WHLb48fSK5LQteWf+rvRiqoPjansoFvzh1dgk+0FON1jUNk4LlwOVEL38WhD98cJ/SwOVdwsYfYySb2pwcZ3K4gdTmax264XFRNGU8Ar4l17NHVtQKBgQDAoVcyWHtpJ6Pk4CuOSWt1S5y1km1dAudJfRAyYlk+9G6Qq1zSoScio/1T/TAS58KHcoSV0SmGu9heF2p02ov4MzsFr//cnBh2Y3aiTnvnyxehp5V0M9CLy524gHDANHO3BxCjlV6tMFqvUuhJfurN36KarYvLJjGU3MoWLPiIVQKBgQCfuWozP2HfdODm6X30kOExsHGK1OOUxFB6VHbDeUJ8ktHsS6DYVa32bANB6slWM2OkeUN5X8Ydke8wIWeOZLl7PxSxgbf+exS9AkYGQq6tvt77ehXVE+mqrzQU33G31d5nU1oseZuDHXFKLW5MNFX/0ri5iOaus07Ido+Dzt5S6QKBgQCef+MEnQOmyaQ0vjN4l3bhA79FM9/i6XGv6UT7gCsY/v0+8pGlCk7uVOssQadd1u8cjiEEOR+nKkdlXHUPA4iqSFUnX+Ly/kmumDbUZCnV1ylxrTfvbncJoBf96UldDYutLRYG0/AcJy5nFpvlZZYEoh/kkCn3lUy0xVtPFd/GJQKBgQCDfPkSHDxyeSZQ2xlj+4xqIGfGLbK/ijO9AuC7rSnWE2bYD1cseItVK6O0nZ0Gw4vmmvHDF9Z6yxCobIzyf6fUExvVRm3oMwjSrjVWfycTKaUUb7CHAU6JH8zQ1DPsTQ+F+W+q1RZZCj1qUBO9cHe9xIPWoK6PN829/UmZAzJeyg==
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,3 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm+F9cDfa3rdu9YFq7F5UsphYp5YXjFM9pCLMikRLZXxO2ox+gZuWxBcXvx5wg8Yd+3pFCauCTHlNWsCYGAOJpb2kOuw0n+PwGVpNg4PEy0GhO1XgSaD2nQ8nIiMLhYXFgdpXw+tikZW16oI344uyI2ROMrFQffQ6H6SfXPcXdDbc87gTY4MYfn+gbHoLCJKiyKShiDjXj62PXAo/rzjGkXVIFnM0Dn7Vl7SV4kc+ZFMcFegkkEG2zxRMkkrZVtljARdeRcnjk1xEb6YDqD+Dvo/9BjFt0fuHSlMRWPkj65jDAeh5iYMkoAiFbsJVCci5ZoWbmiLpq8sidfWHPowdGQIDAQAB
-----END PUBLIC KEY-----