master
cody 11 months ago
parent be9b0cab3a
commit 6e531151bc

@ -1,46 +0,0 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class Sm2DecryptCommand extends Command
{
/**
* The name and signature of the console command.
*
* 用法php artisan sm2:decrypt "密文hex" "私钥hex" [--mode=c1c3c2] [--asn1]
*/
protected $signature = 'sm2:decrypt';
/**
* The console command description.
*/
protected $description = '使用 SM2 私钥解密(硬编码密文与私钥),输出明文';
public function handle(): int
{
// 硬编码密文与私钥(与加密命令匹配)
$cipher = 'e27c3780e7069bda7082a23a489d77587ce309583ed99253f66e1d9833ed1a1d0b5ce86dc6714e9974cf258589139d7b1855e8c9fa2f2c1175ee123a95a23e9bbbaf04ad750b5c304a875aab17851fac60453940aac9da33cc4249a52ee46be446cf5083b5';
$privateKey = 'MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgrEdb4ONfRO2N0cXZsDY0PcGpfzQKfrg6DB0r+1dt4EmgCgYIKoEcz1UBgi2hRANCAARxd7Iuetxpc/2pgiGY1aLz6RvYyz696c9B8s4FghM0K5T4G+ywxIQ4pNFRe2sbp3wJydCIX647Xw1OCRl/vMHt';
$mode = 1; // C1C3C2
try {
$sm2 = new \Rtgm\sm\RtSm2('hex', true);
$plain = $sm2->doDecrypt($cipher, $privateKey, true, $mode);
if ($plain === '') {
$this->error('解密失败C3 校验不通过或格式不匹配');
return self::FAILURE;
}
$this->line($plain);
return self::SUCCESS;
} catch (\Throwable $e) {
$this->error('SM2 解密异常:' . $e->getMessage());
return self::FAILURE;
}
}
}

@ -1,136 +0,0 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class Sm2EncryptCommand extends Command
{
/**
* The name and signature of the console command.
*
* 用法php artisan sm2:encrypt "明文" "公钥hex(可含04前缀)" --mode=c1c3c2
*/
protected $signature = 'sm2:encrypt';
/**
* The console command description.
*/
protected $description = '使用 SM2 公钥加密硬编码明文与公钥返回hex密文';
public function handle(): int
{
// 硬编码待加密明文与公钥hex含04前缀
$message = '{"title": "","district": "","xmlxS":"足球"}';
$publicKey = 'MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEkecuYCCoPprFvmgZoXTtEXcpYyvJi9rgizj+FMqVIL0OSQ24plc4F8ONugktvjPRbwvRly12ieRK9SGiG+9sjA==';
$mode = 1; // C1C3C2
try {
// 若提供的是 SPKI Base64 公钥转换为未压缩点HEX(04+x+y)
$pubHex = $this->normalizePublicKeyToHex($publicKey);
// RtSm2 缺省返回hex且加密返回 c1c3c2
$sm2 = new \Rtgm\sm\RtSm2('hex', true);
$cipherHex = $sm2->doEncrypt($message, $pubHex, $mode);
$this->line($cipherHex);
return self::SUCCESS;
} catch (\Throwable $e) {
$this->error('SM2 加密失败:' . $e->getMessage());
return self::FAILURE;
}
}
private function normalizePublicKeyToHex(string $key): string
{
$trimmed = trim($key);
// 如果已经是 128/130 长度的HEX直接返回
if (preg_match('/^(04)?[0-9a-fA-F]{128}$/', $trimmed)) {
return strtolower($trimmed);
}
// 可能是 Base64(SPKI SubjectPublicKeyInfo)
$bin = base64_decode($trimmed, true);
if ($bin === false) {
throw new \InvalidArgumentException('公钥格式不支持既不是HEX也不是Base64');
}
// 优先使用 OpenSSL 解析 SPKI获取未压缩公钥点
if (function_exists('openssl_pkey_get_public')) {
$pem = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($trimmed, 64, "\n") . "-----END PUBLIC KEY-----\n";
$res = @openssl_pkey_get_public($pem);
if ($res !== false) {
$details = openssl_pkey_get_details($res);
if ($details && isset($details['ec']) && isset($details['ec']['public_key'])) {
$pubBin = $details['ec']['public_key']; // binary starting with 0x04
if ($pubBin !== '' && ord($pubBin[0]) === 0x04) {
return strtolower(bin2hex($pubBin));
}
}
// 某些 PHP 版本可能在 key 索引中提供公钥
if ($details && isset($details['key'])) {
// 再次从 details['key']PEM中提取 BIT STRING
$pem2 = $details['key'];
$clean = str_replace(["-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----", "\r", "\n", " "], '', $pem2);
$bin2 = base64_decode($clean, true);
if ($bin2 !== false) {
$found = $this->extractUncompressedPointFromSpki($bin2);
if ($found !== null) {
return $found;
}
}
}
}
}
// 退而求其次:直接从 SPKI 二进制中提取 BIT STRING不下钻根 SEQUENCE直接扫描 0x03 标签)
$found = $this->extractUncompressedPointFromSpki($bin);
if ($found !== null) {
return $found;
}
throw new \RuntimeException('未找到公钥BIT STRING');
}
private function extractUncompressedPointFromSpki(string $spkiBin): ?string
{
$len = strlen($spkiBin);
for ($pos = 0; $pos < $len; $pos++) {
if (ord($spkiBin[$pos]) !== 0x03) {
continue;
}
$p = $pos + 1;
if ($p >= $len)
break;
$lenByte = ord($spkiBin[$p++]);
if (($lenByte & 0x80) === 0) {
$l = $lenByte;
} else {
$num = $lenByte & 0x7F;
if ($num === 0 || $p + $num > $len) {
continue;
}
$l = 0;
for ($i = 0; $i < $num; $i++) {
$l = ($l << 8) | ord($spkiBin[$p++]);
}
}
if ($p + $l > $len) {
continue;
}
if ($l < 2) {
continue;
}
$unusedBits = ord($spkiBin[$p]);
if ($unusedBits !== 0) {
continue;
}
$bitString = substr($spkiBin, $p + 1, $l - 1);
if ($bitString !== '' && ord($bitString[0]) === 0x04) {
return strtolower(bin2hex($bitString));
}
}
return null;
}
}

@ -7,6 +7,7 @@ use App\Models\Blacklist;
use App\Helpers\ResponseCode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
/**
* @OA\Tag(
@ -116,14 +117,15 @@ class BlacklistController extends BaseController
*/
public function save()
{
$request = new BlacklistRequest();
$request->setContainer(app());
$request->setRedirector(app('redirect'));
$formRequest = app(BlacklistRequest::class);
DB::beginTransaction();
try {
$data = $request->validated();
$all = request()->all();
$validator = Validator::make($all, $formRequest->rules(), $formRequest->messages(), method_exists($formRequest, 'attributes') ? $formRequest->attributes() : []);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$data = $validator->validated();
if (isset($all['id'])) {
// 更新

@ -7,6 +7,7 @@ use App\Models\Config;
use App\Helpers\ResponseCode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
/**
* @OA\Tag(
@ -116,14 +117,16 @@ class ConfigController extends BaseController
*/
public function save()
{
$request = new ConfigRequest();
$request->setContainer(app());
$request->setRedirector(app('redirect'));
DB::beginTransaction();
try {
$data = $request->validated();
$formRequest = app(ConfigRequest::class);
$all = request()->all();
$validator = Validator::make($all, $formRequest->rules(), $formRequest->messages(), method_exists($formRequest, 'attributes') ? $formRequest->attributes() : []);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$data = $validator->validated();
if (isset($all['id'])) {
// 更新
@ -195,4 +198,4 @@ class ConfigController extends BaseController
}
return $query;
}
}
}

@ -8,6 +8,7 @@ use App\Models\Study;
use App\Helpers\ResponseCode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
/**
* @OA\Tag(
@ -118,14 +119,15 @@ class StudyAskController extends BaseController
*/
public function save()
{
$request = new StudyAskRequest();
$request->setContainer(app());
$request->setRedirector(app('redirect'));
$formRequest = app(StudyAskRequest::class);
DB::beginTransaction();
try {
$data = $request->validated();
$all = request()->all();
$validator = Validator::make($all, $formRequest->rules(), $formRequest->messages(), method_exists($formRequest, 'attributes') ? $formRequest->attributes() : []);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$data = $validator->validated();
if (isset($all['id'])) {
// 更新

@ -9,6 +9,7 @@ use App\Helpers\ResponseCode;
use App\Models\StudyLog;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
/**
* @OA\Tag(
@ -149,14 +150,15 @@ class StudyController extends BaseController
*/
public function save()
{
$request = new StudyRequest();
$request->setContainer(app());
$request->setRedirector(app('redirect'));
$formRequest = app(StudyRequest::class);
DB::beginTransaction();
try {
$data = $request->validated();
$all = request()->all();
$validator = Validator::make($all, $formRequest->rules(), $formRequest->messages(), method_exists($formRequest, 'attributes') ? $formRequest->attributes() : []);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$data = $validator->validated();
if (isset($all['id'])) {
// 更新

@ -8,6 +8,7 @@ use App\Models\Admin;
use App\Helpers\ResponseCode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
/**
* @OA\Tag(
@ -116,14 +117,15 @@ class VisitAreaController extends BaseController
*/
public function save()
{
$request = new VisitAreaRequest();
$request->setContainer(app());
$request->setRedirector(app('redirect'));
$formRequest = app(VisitAreaRequest::class);
DB::beginTransaction();
try {
$data = $request->validated();
$all = request()->all();
$validator = Validator::make($all, $formRequest->rules(), $formRequest->messages(), method_exists($formRequest, 'attributes') ? $formRequest->attributes() : []);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$data = $validator->validated();
if (isset($all['id'])) {
// 更新

@ -145,14 +145,15 @@ class VisitController extends BaseController
*/
public function save()
{
$request = new VisitRequest();
$request->setContainer(app());
$request->setRedirector(app('redirect'));
$formRequest = app(VisitRequest::class);
DB::beginTransaction();
try {
$data = $request->validated();
$all = request()->all();
$validator = Validator::make($all, $formRequest->rules(), $formRequest->messages(), method_exists($formRequest, 'attributes') ? $formRequest->attributes() : []);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$data = $validator->validated();
// 检查黑名单
if (Config::isBlacklistCheckEnabled()) {

@ -7,6 +7,7 @@ use App\Models\VisitTime;
use App\Helpers\ResponseCode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
/**
* @OA\Tag(
@ -116,14 +117,15 @@ class VisitTimeController extends BaseController
*/
public function save()
{
$request = new VisitTimeRequest();
$request->setContainer(app());
$request->setRedirector(app('redirect'));
$formRequest = app(VisitTimeRequest::class);
DB::beginTransaction();
try {
$data = $request->validated();
$all = request()->all();
$validator = Validator::make($all, $formRequest->rules(), $formRequest->messages(), method_exists($formRequest, 'attributes') ? $formRequest->attributes() : []);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$data = $validator->validated();
if (isset($all['id'])) {
// 更新

Loading…
Cancel
Save