文档章节

PHP 数据加密工具类

big_cat
 big_cat
发布于 2016/06/20 19:59
字数 472
阅读 101
收藏 7

PHP 数据加密工具类

最近在写一个需要加密传输数据的小项目,顺便把用的加密方法封装成一个工具类,其实就是按字节位把ASCII码进行位运算

加密解密工具类

<?php
/**
 * @date 2016-06-20
 * @author sallency
 * 数据传输加密工具类
 */

class DataSecurityTool
{
    private $key_main = [];
    private $key_sub  = [];

    public function __construct($key_main = "this is main key", $key_sub = "this is sub key")
    {
        $this->key_main = str_split($key_main);
        $this->key_sub  = str_split($key_sub);
    }

    /**
     * 加密函数
     * @param  [type] $context [description]
     * @return [type]          [description]
     */
    public function opEncryption($context)
    {
        $context_bytes = str_split($context);
        $context_len   = count($context_bytes);
        $cur_key_len   = count($this->key_main);

        if (empty($context_bytes)) {
            return null;
        }

        $context_encrypted = [];

        for ($i = 0; $i < $context_len; $i ++) {
            $context_encrypted[$i] = ord($context_bytes[$i] ^ $this->key_main[$i % $cur_key_len]);
        }

        $cur_key_len = count($this->key_sub);

        for ($i = 0; $i < $context_len ; $i ++) {
            $context_encrypted[$i] = $context_encrypted[$i] ^ ord($this->key_sub[$i % $cur_key_len]);
        }

        $data = array_map(function($v) {
            return chr($v);
        }, $context_encrypted);
        
        return base64_encode(implode($data));
    }

    /**
     * 解密函数
     * @param  [type] $context [description]
     * @return [type]          [description]
     */
    public function opDecryption($context)
    {
        $context = base64_decode($context);

        $context_bytes = str_split($context);
        $context_len = count($context_bytes);
        $cur_key_len = count($this->key_sub);

        if (empty($context_bytes)) {
            return null;
        }

        $context_encrypted = [];

        for ($i = 0; $i < $context_len; $i ++) {
            $context_encrypted[$i] = ord($context_bytes[$i] ^ $this->key_sub[$i % $cur_key_len]);
        }

        $cur_key_len = count($this->key_main);

        for ($i = 0; $i < $context_len; $i ++) {
            $context_encrypted[$i] = $context_encrypted[$i] ^ ord($this->key_main[$i % $cur_key_len]);
        }

        $data = array_map(function($char) {
            return chr($char);
        }, $context_encrypted);

        return implode("", $data);
    }
}

使用方法

<?php
//data for encrypt
$info = [
    "access_token" => "as2009_12_34",
    "name" => "我的",
    "age"  => 25,
    "sex"  => "male"
];
$json_data = json_encode($info, JSON_UNESCAPED_UNICODE);

$dataSec = new DataSecurityTool();

//encrypt
$encry_data = $dataSec->opEncryption($json_data);
echo $encry_data;

//decrypt
$decry_data = $dataSec->opDecryption($encry_data);
echo $decry_data;
?>

注意如果传输的是 json 字符串的时候编码时json默认会将中文转码为unicode编码

如果是 php 5.4 可以方便的调用 JSON_UNESCAPED_UNICODE 选项告诉 json_encode 不要只能转码

如果是 php 5.4 以下的版本可以利用 urlencode 做一些封装

解决json中文乱码

<?php
/**
 * 通过 urlencode 将中文编码
 * @param  array  $json_arr [description]
 * @return [type]           [description]
 */
function znJsonEncode(array $json_arr)
{
    $temp = array_map(function($row) {
        return urlencode($row);
    }, $json_arr);
    return json_encode($temp);
}

/**
 * 先 urldecode
 * @param  [type]  $json_str [description]
 * @param  boolean $arr      [description]
 * @return [type]            [description]
 */
function znJsonDecode($json_str, $arr = false)
{
    return json_decode(urldecode($json_str), $arr);
}

即可完成中文的传输和解码

© 著作权归作者所有

big_cat
粉丝 48
博文 237
码字总数 162867
作品 0
长宁
后端工程师
私信 提问
做个类似于&quot;www.zhaoyuanma.com&quot;网站

【业务需求】 一、功能需求 做个类似于"www.zhaoyuanma.com"网站, 1. 首页 解密加密相关的简介,系统会员数,已经解密所有文件的数量、大小, 已经加密所有文件的数量、大小 今天新增注册会...

老四
2017/03/10
51
0
做个类似于&quot;www.zhaoyuanma.com&quot;网站

【业务需求】 一、功能需求 做个类似于"www.zhaoyuanma.com"网站, 1. 首页 解密加密相关的简介,系统会员数,已经解密所有文件的数量、大小, 已经加密所有文件的数量、大小 今天新增注册会...

老四
2017/03/10
7
0
php7 openssl_decrypt AES的ECB与CBC加解密

php7.2版本用opensslencrypt代替mcryptencrypt,导致以往自己写的Aes加密类不能用。 这次项目客户端用的是 AES-128-ECB 加密,我用在线AES工具来测试,发现自己写的加解密方法得到的值不一样...

jichun
2018/05/08
799
0
自己做工具--封装PHP的工具类

更多精彩请访问,请一定记得 star :https://github.com/whm19940308/phpTools 转载请标明原文链接:https://www.jianshu.com/p/8ab3dce8d6f1 一、使用示例 二、代码目录 主要有几大工具类:...

whmblog
2018/08/26
0
0
HerosPHP 3.0.0 发布,PHP开发框架

HerosPHP 3.0.0 发布了。HerosPHP是一个轻量级PHP web 程序开发框架。作者开发这个框架的初衷是想作为一个学习型的框架给那些想深入了解框架并想自己开发框架的phper借鉴用的,期初是为了面向...

阳建
2017/02/28
886
2

没有更多内容

加载失败,请刷新页面

加载更多

Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
52分钟前
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
今天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
今天
7
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
今天
2
0
Linux创建yum仓库

第一步、搞定自己的光盘 #创建文件夹 mkdir -p /media/cdrom #挂载光盘 mount /dev/cdrom /media/cdrom #编辑配置文件使其永久生效 vim /etc/fstab 第二步,编辑yun源 vim /ect yum.repos.d...

究极小怪兽zzz
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部