php 简单加密解密

<?php
namespace App\Service;

/*
* @link http://kodcloud.com/
* @author warlee | e-mail:[email protected]
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/licenses/license.txt
*------
* 字符串加解密类;
* 一次一密;且定时解密有效
* 可用于加密&动态key生成
* demo:
* 加密:echo Mcrypt::encode(‘abc‘,‘123‘);
* 解密:echo Mcrypt::decode(‘9f843I0crjv5y0dWE_-uwzL_mZRyRb1ynjGK4I_IACQ‘,‘123‘);
*/

class Mcrypt{
    private static $default_key = ‘a!takA:d1989lmc1988ldEv,e‘;

    /**
     * 字符加密,一次一密,可定时解密有效
     *
     * @param string $string 原文
     * @param string $key 密钥
     * @param int $expiry 密文有效期,单位s,0 为永久有效
     * @return string 加密后的内容
     */
    public static function encode($string,$key = ‘‘, $expiry = 0){
        $ckeyLength = 4;
        $key = md5($key ? $key : self::$default_key); //解密密匙
        $keya = md5(substr($key, 0, 16));         //做数据完整性验证
        $keyb = md5(substr($key, 16, 16));         //用于变化生成的密文 (初始化向量IV)
        $keyc = substr(md5(microtime()), - $ckeyLength);
        $cryptkey = $keya . md5($keya . $keyc);
        $keyLength = strlen($cryptkey);
        $string = sprintf(‘%010d‘, $expiry ? $expiry + time() : 0).substr(md5($string . $keyb), 0, 16) . $string;
        $stringLength = strlen($string);

        $rndkey = array();
        for($i = 0; $i <= 255; $i++) {
            $rndkey[$i] = ord($cryptkey[$i % $keyLength]);
        }

        $box = range(0, 255);
        // 打乱密匙簿,增加随机性
        for($j = $i = 0; $i < 256; $i++) {
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        // 加解密,从密匙簿得出密匙进行异或,再转成字符
        $result = ‘‘;
        for($a = $j = $i = 0; $i < $stringLength; $i++) {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
        }
        $result = $keyc . str_replace(‘=‘, ‘‘, base64_encode($result));
        $result = str_replace(array(‘+‘, ‘/‘, ‘=‘),array(‘-‘, ‘_‘, ‘.‘), $result);
        return $result;
    }

    /**
     * 字符解密,一次一密,可定时解密有效
     *
     * @param string $string 密文
     * @param string $key 解密密钥
     * @return string 解密后的内容
     */
    public static function decode($string,$key = ‘‘)
    {
        $string = str_replace(array(‘-‘, ‘_‘, ‘.‘),array(‘+‘, ‘/‘, ‘=‘), $string);
        $ckeyLength = 4;
        $key = md5($key ? $key : self::$default_key); //解密密匙
        $keya = md5(substr($key, 0, 16));         //做数据完整性验证
        $keyb = md5(substr($key, 16, 16));         //用于变化生成的密文 (初始化向量IV)
        $keyc = substr($string, 0, $ckeyLength);
        $cryptkey = $keya . md5($keya . $keyc);
        $keyLength = strlen($cryptkey);
        $string = base64_decode(substr($string, $ckeyLength));
        $stringLength = strlen($string);

        $rndkey = array();
        for($i = 0; $i <= 255; $i++) {
            $rndkey[$i] = ord($cryptkey[$i % $keyLength]);
        }

        $box = range(0, 255);
        // 打乱密匙簿,增加随机性
        for($j = $i = 0; $i < 256; $i++) {
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        // 加解密,从密匙簿得出密匙进行异或,再转成字符
        $result = ‘‘;
        for($a = $j = $i = 0; $i < $stringLength; $i++) {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
        }
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0)
            && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)
        ) {
            return substr($result, 26);
        } else {
            return ‘‘;
        }
    }
}

原文地址:https://www.cnblogs.com/sunlong88/p/11230822.html

时间: 2024-08-04 06:57:03

php 简单加密解密的相关文章

JavaSE——装饰设计模式+简单加密解密工程

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. 装饰设计模式: 写信的例题:在原来的基础上添加新的佐料形成新的产品 如下面图片,都是佐料,可以随意搭配 然后就可以随意搭配 如何加密解密:可以使用JiaMiOutputStream去写东西,如何在输出字节之前给加密呢,使用FileOutputStream然后在输出去,到时候读上来就用FileInputStream,然后在用JieMiInputStream来还

AES简单加密解密的方法实现

package com.mstf.aes; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.BadPaddingException; import javax.crypt

C#对字符串的简单加密解密过程C#的SQL数据库登陆密码的加密解密加密还原直接复制代码使用即可

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO; namespace PDAPrint { class ClassSecurityString { public static string encryptKey = "www.hanma-scan.com"; /

Python_字符串简单加密解密

1 def crypt(source,key): 2 from itertools import cycle 3 result='' 4 temp=cycle(key) 5 for ch in source: 6 result=result+chr(ord(ch)^ord(next(temp))) 7 return result 8 9 source='Jiangxi Insstitute of Busiess and Technology' 10 key='zWrite' 11 12 prin

异或运算实现加密解密

异或运算中,如果某个字符(或数值)x 与 一个数值m 进行异或运算得到y,则再用y 与 m 进行异或运算就可以还原为 x ,因此应用这个原理可以实现数据的加密解密功能. 异或运算在java中通常有两个比较常用的方法,一个是两个变量的互换(不借助第三个变量),一个便是数据的简单加密解密. 两个变量的互换 java运算中,如果要交换两变量的值,通常的做法就是借助第三个临时变量,然后完成操作. 如 public static void main(String[] args) { int[] arr =

简单的加密解密处理

今天一位小朋友通过邮箱向我发送一封求助信息. 内容大致如下: 您好!之前您写的那个C#客户端服务器程序运行成功,但能不能加上一个加密解密的函数,老师要求客户端/服务器模式,可以在局域网内传送字符文本消息,要求不能使用明文,有成对的加密/解密处理.您能帮我解决一下吗?谢谢 他问的这个C#客户端我还真的忘记是什么了,后来看了看才明白是我之前做过的一个Socket通讯测试. 其实加密解密原理算是比较简单的,只要把简单原理用复杂结构支撑,那么这种加密就是无法破解,我先展示一下加码前后的效果 我的加密解密

【C/C++学院】0801-重定向以及文件扫描/二进制加密解密/简单加密/按照密码加密/动态库与静态库

重定向以及文件扫描 #define _CRT_SECURE_NO_WARNINGS//关闭安全检查 #include<stdio.h> #include<stdlib.h> void main1() { char str[100] = { 0 }; scanf("%s", str); printf("str=%s\n", str); system(str); } void main2() { char str[100] = { 0 }; fs

Sql Server简单加密与解密 【转】

前言: 在SQL Server 2005和SQL Server 2008之前.如果希望加密敏感数据,如财务信息.工资或身份证号,必须借助外部应用程序或算法.SQL Server 2005引入内建数据加密的能力,使用证书.密钥和系统函数的组合来完成. 与数字证书类似.SQL Server 证书包括公钥和私钥这一对密钥,它们都用来加密和解密数据.SQL Server也拥有创建非对称密钥和对称密钥对象的能力.非对称密钥(asymmetric key)与证书相似,公钥用来加密数据库,私钥用来解密数据.非

加密解密

在现代密码学中,加密方法大致可分为对称密钥加密(对称加密)和公开密钥加密(非对称加密). 一. 对称加密(Symmetric-key algorithm,或对等加密: Reciprocal cipher ) 对称加密,即加密和解密使用同一个密钥,或者知道一方密钥能够轻易计算出另一方密钥.其解密(decryption)算法等同于加密算法,也就是说,要还原对等加密的密文,套用加密同样的算法即可得到明文. 对称加密的速度比非对称加密快很多,在很多场合都需要对称加密. 对称加密又可分为分组密码(分组加密