Jerry's WIKIJerry's WIKI
概述
  • 🐞 web使用
  • 📐 常用组件
  • 💡 使用技巧
  • 🎱 规范相关
  • 🖥 工作流
  • 🛠 常用工具
  • 🌐️ 服务器
  • 📦 容器相关
  • ♨️ 编程语言
咖啡屋
  • 简体中文
  • English
GitHub
概述
  • 🐞 web使用
  • 📐 常用组件
  • 💡 使用技巧
  • 🎱 规范相关
  • 🖥 工作流
  • 🛠 常用工具
  • 🌐️ 服务器
  • 📦 容器相关
  • ♨️ 编程语言
咖啡屋
  • 简体中文
  • English
GitHub
  • 🖼 图像相关

    • 二维码
    • 条形码
    • 验证码
  • 🔐 锁相关

    • Redis分布式锁
    • 数据库悲观锁
    • 数据库乐观锁
    • 队列(单个消费)
  • 🏢 Office相关

    • 数据导出Excel
    • 数据导出Csv
  • ↔️ 加解密

    • AES
    • RSA
    • AWS4
    • RC4
  • 🍪 登录相关

    • JWT
    • Cookie
    • Session
    • Q&A
  • 📀 服务部署

    • 说明
    • 部署流程

RC4

目录

  • 安装扩展包
  • 封装工具类
  • 使用
    • 加密
    • 解密

【说明】

RC4 是一套对称加密算法,常用于数据加密。
与非对称加密不同的是:对称加密只有一把秘钥。


安装扩展包

标准库地址

composer require phpseclib/phpseclib

封装工具类

详情
<?php

declare(strict_types=1);
namespace App\Lib\Encrypt;

use phpseclib3\Crypt\RC4;

class Rc4WithPHPSecLib
{
    /**
     * RC4实例对象.
     * @var RC4 rc4实例
     */
    private RC4 $RC4;

    /**
     * 秘钥.
     * @var string ''
     */
    private string $key;

    /**
     * 构造函数.
     */
    public function __construct(string $key = 'abc')
    {
        $this->key = $key;
        $this->RC4 = new RC4();

        $this->RC4->setKey($this->key);
        // TODO $RC4 还有一些设置IV等, 这里不作展开 :)
    }

    /**
     * 加密.
     * @param array|string $message 待加密数据
     * @return string 加密后数据
     */
    public function encrypt(array|string $message): string
    {
        $message = is_array($message) ? json_encode($message, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $message;
        return base64_encode($this->RC4->encrypt($message));
    }

    /**
     * 解密.
     * @param string $encryptData 待解密数据
     * @return array|string 解密后数据
     */
    public function decrypt(string $encryptData): array|string
    {
        $decryptData = $this->RC4->decrypt(base64_decode($encryptData));
        return json_decode($decryptData, true) ?? $decryptData;
    }

    /**
     * 原生加密.
     * @param array|string $message 待加密数据
     * @return string 加密后数据
     */
    public function encryptNative(array|string $message): string
    {
        $message = is_array($message) ? json_encode($message, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $message;
        return base64_encode($this->native($this->key, $message));
    }

    /**
     * 原生解密.
     * @param string $encryptData 待解密数据
     * @return array|string 解密后数据
     */
    public function decryptNative(string $encryptData): array|string
    {
        $decryptData = $this->native($this->key, base64_decode($encryptData));
        return json_decode($decryptData, true) ?? $decryptData;
    }

    /**
     * 原生算法.
     * @param string $key 秘钥
     * @param string $data 待解密数据
     * @return string 加密后数据
     */
    private function native(string $key, string $data): string
    {
        $cipher = '';
        $keyMap[] = '';
        $box[] = '';
        $pwdLength = strlen($key);
        $dataLength = strlen($data);
        for ($i = 0; $i < 256; ++$i) {
            $keyMap[$i] = ord($key[$i % $pwdLength]);
            $box[$i] = $i;
        }
        for ($j = $i = 0; $i < 256; ++$i) {
            $j = ($j + $box[$i] + $keyMap[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        for ($a = $j = $i = 0; $i < $dataLength; ++$i) {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            $k = $box[($box[$a] + $box[$j]) % 256];
            $cipher .= chr(ord($data[$i]) ^ $k);
        }
        return $cipher;
    }
}

使用

加密

/**
 * RC4加密.
 * @param EncryptRequest $request 请求验证器
 * @return array ['code' => '200', 'msg' => 'ok', 'status' => true, 'data' => []]
 */
#[PostMapping(path: 'rc4/encrypt')]
#[Scene(scene: 'rc4')]
public function rc4Encrypt(EncryptRequest $request): array
{
    $key = $request->input('key');
    $data = $request->input('data');
    $rc4 = new Rc4WithPHPSecLib($key);
    $result = $rc4->encrypt($data);
    return $this->result->setData(['encrypt_result' => $result])->getResult();
}

解密

/**
 * RC4解密.
 * @param EncryptRequest $request 请求验证器
 * @return array ['code' => '200', 'msg' => 'ok', 'status' => true, 'data' => []]
 */
#[PostMapping(path: 'rc4/decrypt')]
#[Scene(scene: 'rc4')]
public function rc4Decrypt(EncryptRequest $request): array
{
    $key = $request->input('key');
    $data = $request->input('data');
    $rc4 = new Rc4WithPHPSecLib($key);
    $result = $rc4->decrypt($data);
    return $this->result->setData(['decrypt_result' => $result])->getResult();
}
编辑此页面
更新时间:
贡献者: 田朝帆, JerryTZF
Prev
AWS4
Next
Jwt