소스 검색

测试,科普答题积分传到icbc

lizhen 1 일 전
부모
커밋
b3cc4f4271

+ 8 - 94
application/api/controller/Demo.php

@@ -3,6 +3,7 @@
 namespace app\api\controller;
 
 use app\common\controller\Api;
+use app\common\library\RsaUtil;
 
 /**
  * 示例接口
@@ -90,7 +91,12 @@ class Demo extends Api
              'remark7'      => '',*/
         ];
 
-        $sign = $this->sign(base64_encode(json_encode($biz_content)));
+        $public_key = APP_PATH.'/common/certs/icbc/public_key.pem';
+        $private_key = APP_PATH.'/common/certs/icbc/private_key.pem';
+        $rsautil =  new RsaUtil($public_key,$private_key);
+
+        $sign = $rsautil->publicEncrypt(json_encode($biz_content));
+dump($sign);
 
         $data = [
             'app_id' => '10000000000004096993',
@@ -106,100 +112,8 @@ class Demo extends Api
         ];
 
         $rs = curl_post($url, json_encode($data, JSON_UNESCAPED_UNICODE));
-        dump($rs);
-    }
-
-    private function sign($data)
-    {
-        $private_key = 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR8/ZvKPAdZzsyvapySvztQm56s1N59ynKMOWpUbK4c5MNWMl+q3dvsp+UiSAx2TAeGkYfW3W6nO/3Y0hAZki99fmuzpPujEeHhs79HNwGZYQjN71Vck2JeflTq8jpL+9/up0Kz2nbwtZDMKTTEgbfNeO24gV1bmvD2kQ9j66RIyuXSDwQbVbQfl6LiqKoJm3rbtsbwX1Ytc0/Szslyor1VdPZWnHDMm3m78Hqu7X3vL6K7fAW/4FVbeKV7vWjvyiTQfETmuADqMdsqV5YeqUZWE/Dnzg+6JV/3L9nJ8f+/mPlh8k1h1oW035GrADKFKf1M2ujKKeHICnj7qKCdBeNAgMBAAECggEAHkh+U2YtHAy1Tbvox7ojbJ8iCTd4FJBiDV/D5zPaX0crtdM8S5oMOBLZ5ZnmIjGsODK/ZfY2ITg62huxfBs88J0+5zRZoV9d4BLqk74PMQyTNDN2h2omCGZUgzXbg/a8PMZdm0aZ8k0k4+AN8vWEk3+89c9Dzq/QkFyTWCqdz+Mp9NkcOjA255kj5/D1q9Zj0x9VcmKg3oTtrKL/dkspUxVaMKXcpo6J4AszC05tT3N0SNLhcq51I6B9QdbYsYCkP9whPNYIl/y4dN4QnNEivQzA5/ltr5DDQZc7Xke1+SpJN+ylBOBJ8yvNoDnuxx0xEWuNJ5bUzyri/DNjZRKNQQKBgQDKkxn5R4Q3rChI/KVIXHMecTs9fXN5pbnA8UKU6ZeTl+wHffxwRieHZJJp1nDcQ5i8YXCtqEJcJGFn3T0rEjVCJ/RVHclFO+TjYaK9HtyNJLPrvKmAzjCzV1yPfe4qmpgJddzZI7Vii2uFgklixvhkoY74hwSJtvLPTO0p0xrYdQKBgQC4cgfpCMLYlaHQGz+dAEf4IewQpwBGn7XShCpiXGFciGZZEIzvJMzXP7yo8pDMHQbB4kQsTRRG2fcdHGWI5VQGHPqG5O0tUueKGUlSg7j8Y/Pp8ZrBGSrlilAf17I/u9MC7Xe2ZRVGNgPDYAyjMEGmClI0n2+aN6b4CFVBjYmfuQKBgEKO9KDIE7QrF41rnW7aGWTuNVWty2wzvIWdf4/n9EqlRwLrLS9CjahZrhWiRLDKcPusVFZqi2s09OAoe/mT4PXcpNX2lHPwCvN+1/allje10HvrIBJXLP8v/BSVftR2uO+azzZ1GhrHzksulKgk0eZWguA7lI0fFEZycxYj65UlAoGAD9p1RZlkLfuGgf2llRgOF4zK3o+MHYXiuep0PioUkECFE4ixpGh0Vtf6nkbjHTgteYK6O1iQsppPfCgRrheQBkp9WhTZMfkbP6p2u+nof4ET2PrUQ16naj1eL655erLpKypADORZVMSVxDhAPdKLAfuHH1DI5ed8qXsF4PGKb7kCgYEAm/d+daT6YsbHDZlJ/J9Q8rRkKmiqj43NGQSHKg6Z6BEDibm8wRmj3Itu1N6XVChuaH+ekJzvUnZ/q1nyYzGvy6bOHYn3ziF9aH7wuhcRZ4qARmKDnzTBLg2QXBK1+400O3LJ+sAH/yuH/Y4hzRE6YMxBQpdYfnlJcIFVimAsT1w=';
-        $public_key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp2mmCWIxUMx32dEfyOTgslQi0nf7i0tPE5PQbmfpttRGzEPJe5hfMThLlcQ0eh92SeheaCdVMk9OzF5zZiO++fofzr2dRn5fAUAXLVkkOGyQ3x9YR2yE7VisK7RxckE59O9lX1w9iWuSSuacUCtFfXLxap8bfW/aEBLNxmBu3x6Ld5vMBztqn2qTYVZqPN9TBVaJvbTqFty6O+wa1G43YqgX1O5eBiLuVoTijlNm9dGDx3tg52af/6X8N8W6yBBAo+k9/D9oDU8lYdIm6d2D1HEOfBrHcdNTDtMR620Fml1JAsvjD+ku5sEXKm9pb8iRZuqRhjE7BVm46feG8YOz2wIDAQAB';
-
-
-        $public_key = "-----BEGIN PUBLIC KEY-----" .PHP_EOL.
-            wordwrap($public_key, 64, PHP_EOL, true) .
-            PHP_EOL."-----END PUBLIC KEY-----";
-
-
-        dump($public_key);
-        openssl_public_encrypt($data,$encrypted, $public_key);
-        echo openssl_error_string();
-        return base64_encode($encrypted);
-
-    }
-
-    public function test4(){
-        // 演示开始
-        echo "=== RSA加密解密演示 ===\n\n";
-
-// 1. 生成密钥对
-        echo "1. 生成RSA密钥对...\n";
-        $keys = $this->generateRsaKeys();
-        $privateKey = $keys['private_key'];
-        $publicKey = $keys['public_key'];
-
-        echo "公钥:\n" . $publicKey . "\n";
-        echo "私钥:\n" . $privateKey . "\n\n";
-
-// 2. 要加密的原始数据
-        $originalData = "这是一个使用RSA加密的测试消息。Hello RSA! 123456";
-        echo "2. 原始数据:\n" . $originalData . "\n\n";
-
-// 3. 使用公钥加密
-        echo "3. 使用公钥加密数据...\n";
-        $encryptedData = $this->rsaEncrypt($originalData, $publicKey);
-        echo "加密后的数据(Base64):\n" . $encryptedData . "\n\n";
-
-// 4. 使用私钥解密
-        echo "4. 使用私钥解密数据...\n";
-        $decryptedData = $this->rsaDecrypt($encryptedData, $privateKey);
-        echo "解密后的数据:\n" . $decryptedData . "\n\n";
-
-// 5. 验证结果
-        echo "5. 验证结果:\n";
-        if ($originalData === $decryptedData) {
-            echo "✓ 加密解密成功,原始数据与解密数据一致!\n";
-        } else {
-            echo "✗ 加密解密失败,数据不一致!\n";
-        }
-
-        echo "\n=== 演示结束 ===\n";
+        //dump($rs);
     }
 
 
-    function generateRsaKeys($keySize = 2048) {
-        $config = array(
-            "digest_alg" => "sha512",
-            "private_key_bits" => $keySize,
-            "private_key_type" => OPENSSL_KEYTYPE_RSA,
-        );
-
-        // 生成密钥对
-        $res = openssl_pkey_new($config);
-
-        // 获取私钥
-        openssl_pkey_export($res, $privateKey);
-
-        // 获取公钥
-        $publicKey = openssl_pkey_get_details($res);
-        $publicKey = $publicKey["key"];
-
-        return array(
-            'private_key' => $privateKey,
-            'public_key'  => $publicKey
-        );
-    }
-
-// RSA加密
-    function rsaEncrypt($data, $publicKey) {
-        openssl_public_encrypt($data, $encrypted, $publicKey);
-        return base64_encode($encrypted);
-    }
-
-// RSA解密
-    function rsaDecrypt($encryptedData, $privateKey) {
-        $encryptedData = base64_decode($encryptedData);
-        openssl_private_decrypt($encryptedData, $decrypted, $privateKey);
-        return $decrypted;
-    }
-
 }

+ 28 - 0
application/common/certs/icbc/private_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR8/ZvKPAdZzsy
+vapySvztQm56s1N59ynKMOWpUbK4c5MNWMl+q3dvsp+UiSAx2TAeGkYfW3W6nO/3
+Y0hAZki99fmuzpPujEeHhs79HNwGZYQjN71Vck2JeflTq8jpL+9/up0Kz2nbwtZD
+MKTTEgbfNeO24gV1bmvD2kQ9j66RIyuXSDwQbVbQfl6LiqKoJm3rbtsbwX1Ytc0/
+Szslyor1VdPZWnHDMm3m78Hqu7X3vL6K7fAW/4FVbeKV7vWjvyiTQfETmuADqMds
+qV5YeqUZWE/Dnzg+6JV/3L9nJ8f+/mPlh8k1h1oW035GrADKFKf1M2ujKKeHICnj
+7qKCdBeNAgMBAAECggEAHkh+U2YtHAy1Tbvox7ojbJ8iCTd4FJBiDV/D5zPaX0cr
+tdM8S5oMOBLZ5ZnmIjGsODK/ZfY2ITg62huxfBs88J0+5zRZoV9d4BLqk74PMQyT
+NDN2h2omCGZUgzXbg/a8PMZdm0aZ8k0k4+AN8vWEk3+89c9Dzq/QkFyTWCqdz+Mp
+9NkcOjA255kj5/D1q9Zj0x9VcmKg3oTtrKL/dkspUxVaMKXcpo6J4AszC05tT3N0
+SNLhcq51I6B9QdbYsYCkP9whPNYIl/y4dN4QnNEivQzA5/ltr5DDQZc7Xke1+SpJ
+N+ylBOBJ8yvNoDnuxx0xEWuNJ5bUzyri/DNjZRKNQQKBgQDKkxn5R4Q3rChI/KVI
+XHMecTs9fXN5pbnA8UKU6ZeTl+wHffxwRieHZJJp1nDcQ5i8YXCtqEJcJGFn3T0r
+EjVCJ/RVHclFO+TjYaK9HtyNJLPrvKmAzjCzV1yPfe4qmpgJddzZI7Vii2uFgkli
+xvhkoY74hwSJtvLPTO0p0xrYdQKBgQC4cgfpCMLYlaHQGz+dAEf4IewQpwBGn7XS
+hCpiXGFciGZZEIzvJMzXP7yo8pDMHQbB4kQsTRRG2fcdHGWI5VQGHPqG5O0tUueK
+GUlSg7j8Y/Pp8ZrBGSrlilAf17I/u9MC7Xe2ZRVGNgPDYAyjMEGmClI0n2+aN6b4
+CFVBjYmfuQKBgEKO9KDIE7QrF41rnW7aGWTuNVWty2wzvIWdf4/n9EqlRwLrLS9C
+jahZrhWiRLDKcPusVFZqi2s09OAoe/mT4PXcpNX2lHPwCvN+1/allje10HvrIBJX
+LP8v/BSVftR2uO+azzZ1GhrHzksulKgk0eZWguA7lI0fFEZycxYj65UlAoGAD9p1
+RZlkLfuGgf2llRgOF4zK3o+MHYXiuep0PioUkECFE4ixpGh0Vtf6nkbjHTgteYK6
+O1iQsppPfCgRrheQBkp9WhTZMfkbP6p2u+nof4ET2PrUQ16naj1eL655erLpKypA
+DORZVMSVxDhAPdKLAfuHH1DI5ed8qXsF4PGKb7kCgYEAm/d+daT6YsbHDZlJ/J9Q
+8rRkKmiqj43NGQSHKg6Z6BEDibm8wRmj3Itu1N6XVChuaH+ekJzvUnZ/q1nyYzGv
+y6bOHYn3ziF9aH7wuhcRZ4qARmKDnzTBLg2QXBK1+400O3LJ+sAH/yuH/Y4hzRE6
+YMxBQpdYfnlJcIFVimAsT1w=
+-----END PRIVATE KEY-----

+ 9 - 0
application/common/certs/icbc/public_key.pem

@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuBbfoAiMt8HmTHC/nej6
+2ralKdgarE2UnIxTlxl3+1arKYpVp1fcOVWNN2J99EEhiYjF+2LAKpne18DA7bFo
+xHct92n8h9Zr9x5s1Iwu+rWCWUQ8It4i/1F+H+cIN6v0pxHbdHlI7L8rYeVL93Uj
+7t91WppSrqR4u3DS58holbcelwlFj2XbiP3cfByIT7/pYwTFxIX3dpwTUg4MzMTY
+38OKO2xRwhaiBIzq5JLoWRG85KVKrvp109Jco1DTez2SkUxV5sohSafcPKEmE1MU
+clQ0MVxZmhRTc/0/XZV+c2Sbd3jpca5TGsM3yU/LI0z1If0mlhgH28+juQb6LbCD
+XQIDAQAB
+-----END PUBLIC KEY-----

+ 169 - 0
application/common/library/RsaUtil.php

@@ -0,0 +1,169 @@
+<?php
+
+namespace app\common\library;
+
+/**
+ * RSA 加密工具类
+ */
+class RsaUtil{
+    const RSA_ALGORITHM_KEY_TYPE = OPENSSL_KEYTYPE_RSA;
+    const RSA_ALGORITHM_SIGN = OPENSSL_ALGO_SHA256;
+
+    protected $public_key; // 公钥
+    protected $private_key; // 私钥
+    protected $key_len;
+
+    /**
+     * @throws \Exception
+     */
+    public function __construct($pub_key = '', $pri_key = '')
+    {
+        $pub_key = file_get_contents(!empty($pub_key) ? $pub_key : APP_PATH.'/utils/certs/public_key.pem'); // 获取公钥文件中的数据
+        $pri_key = file_get_contents(!empty($pri_key) ? $pri_key : APP_PATH.'/utils/certs/private_key.pem'); // 获取私钥文件中的数据
+
+        if ($pub_key) {
+            $this->public_key = $pub_key;
+            $pub_id = openssl_pkey_get_public($this->public_key);
+            $this->key_len = openssl_pkey_get_details($pub_id)['bits'];
+        }
+
+        if ($pri_key) {
+            $this->private_key = $pri_key;
+            $pri_id = openssl_pkey_get_private($this->private_key);
+            $this->key_len = openssl_pkey_get_details($pri_id)['bits'];
+        }
+    }
+
+    /**
+     * 创建密钥对
+     *
+     * @param $key_size
+     * @return array
+     */
+    public static function createKeys($key_size = 1024)
+    {
+        $config = array(
+            "private_key_bits" => $key_size,
+            "private_key_type" => self::RSA_ALGORITHM_KEY_TYPE,
+        );
+        $res = openssl_pkey_new($config);
+        openssl_pkey_export($res, $private_key);
+        $public_key_detail = openssl_pkey_get_details($res);
+        $public_key = $public_key_detail["key"];
+
+        return array(
+            "public_key" => $public_key,
+            "private_key" => $private_key,
+        );
+    }
+
+    /**
+     * 私钥解密
+     *
+     * @param $encrypted
+     * @return string
+     */
+    public function privateDecrypt($encrypted)
+    {
+        $decrypted = "";
+        $part_len = $this->key_len / 8;
+        //url  中的get传值默认会吧+号过滤成' ',替换回来就好了
+        str_replace('% ', '+', $encrypted);
+        $base64_decoded = base64_decode($encrypted);
+        $parts = str_split($base64_decoded, $part_len);
+        foreach ($parts as $part) {
+            $decrypted_temp = '';
+            openssl_private_decrypt($part, $decrypted_temp, $this->private_key);
+            $decrypted .= $decrypted_temp;
+        }
+        return $decrypted;
+    }
+
+    /**
+     * 私钥加密
+     *
+     * @param $data
+     * @return string
+     */
+    public function privateEncrypt($data)
+    {
+        $encrypted = '';
+        $part_len = $this->key_len / 8 - 11;
+        $parts = str_split($data, $part_len);
+
+        foreach ($parts as $part) {
+            $encrypted_temp = '';
+            openssl_private_encrypt($part, $encrypted_temp, $this->private_key);
+            $encrypted .= $encrypted_temp;
+        }
+        return base64_encode($encrypted);
+    }
+
+    /**
+     * 公钥解密
+     *
+     * @param $encrypted
+     * @return string
+     */
+    public function publicDecrypt($encrypted)
+    {
+        $decrypted = "";
+        $part_len = $this->key_len / 8;
+        $base64_decoded = base64_decode($encrypted);
+        $parts = str_split($base64_decoded, $part_len);
+
+        foreach ($parts as $part) {
+            $decrypted_temp = '';
+            openssl_public_decrypt($part, $decrypted_temp, $this->public_key);
+            $decrypted .= $decrypted_temp;
+        }
+        return $decrypted;
+    }
+
+    /**
+     * 公钥加密
+     *
+     * @param $data
+     * @return string
+     */
+    public function publicEncrypt($data)
+    {
+        $encrypted = '';
+        $part_len = $this->key_len / 8 - 11;
+        $parts = str_split($data, $part_len);
+
+        foreach ($parts as $part) {
+            $encrypted_temp = '';
+            openssl_public_encrypt($part, $encrypted_temp, $this->public_key);
+            $encrypted .= $encrypted_temp;
+        }
+
+        return base64_encode($encrypted);
+    }
+
+    /**
+     * 数据加签
+     *
+     * @param $data
+     * @return string
+     */
+    public function sign($data)
+    {
+        openssl_sign($data, $sign, $this->private_key, self::RSA_ALGORITHM_SIGN);
+        return base64_encode($sign);
+    }
+
+    /**
+     * 数据签名验证
+     *
+     * @param $data
+     * @param $sign
+     * @return false|int
+     */
+    public function verify($data, $sign)
+    {
+        $pub_id = openssl_get_publickey($this->public_key);
+        $res = openssl_verify($data, base64_decode($sign), $pub_id, self::RSA_ALGORITHM_SIGN);
+        return $res;
+    }
+}