init: 项目初始代码
This commit is contained in:
292
extend/encryption/Rsa.php
Normal file
292
extend/encryption/Rsa.php
Normal 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);
|
||||
}
|
||||
}
|
||||
0
extend/encryption/cert/csrkey.cer
Normal file
0
extend/encryption/cert/csrkey.cer
Normal file
0
extend/encryption/cert/private_key.pfx
Normal file
0
extend/encryption/cert/private_key.pfx
Normal file
3
extend/encryption/cert/rsa_private_key.pem
Normal file
3
extend/encryption/cert/rsa_private_key.pem
Normal 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-----
|
||||
3
extend/encryption/cert/rsa_public_key.pem
Normal file
3
extend/encryption/cert/rsa_public_key.pem
Normal file
@@ -0,0 +1,3 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm+F9cDfa3rdu9YFq7F5UsphYp5YXjFM9pCLMikRLZXxO2ox+gZuWxBcXvx5wg8Yd+3pFCauCTHlNWsCYGAOJpb2kOuw0n+PwGVpNg4PEy0GhO1XgSaD2nQ8nIiMLhYXFgdpXw+tikZW16oI344uyI2ROMrFQffQ6H6SfXPcXdDbc87gTY4MYfn+gbHoLCJKiyKShiDjXj62PXAo/rzjGkXVIFnM0Dn7Vl7SV4kc+ZFMcFegkkEG2zxRMkkrZVtljARdeRcnjk1xEb6YDqD+Dvo/9BjFt0fuHSlMRWPkj65jDAeh5iYMkoAiFbsJVCci5ZoWbmiLpq8sidfWHPowdGQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
Reference in New Issue
Block a user