文档章节

一个略高效的自制加解密函数

w
 weixingo
发布于 2016/07/05 09:51
字数 572
阅读 32
收藏 0

<?php
/**
 * Crypt class file.
 * 
 * @author woondroo
 * @package framework
 * @date 2015-04-09
 */
class Crypt
{
    /**
     * Passport 加密函数
     *
     * @param    string     等待加密的原字串
     * @param    string     私有密匙(用于解密和加密)
     *
     * @return    string     原字串经过私有密匙加密后的结果
     */
    public static function encode( $_strVal = "" , $_strKey = "" )
    {
        // 使用随机数发生器产生 0~32000 的值并 MD5()
        srand((double)microtime() * 1000000);
        $encrypt_key = md5(rand(0, 32000));

        // 变量初始化
        $ctr = 0;
        $tmp = '';

        // for 循环,$i 为从 0 开始,到小于 $_strVal 字串长度的整数
        for($i = 0; $i < strlen($_strVal); $i++)
        {
            // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零
            $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
            // $tmp 字串在末尾增加两位,其第一位内容为 $encrypt_key 的第 $ctr 位,
            // 第二位内容为 $_strVal 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1
            $tmp .= $encrypt_key[$ctr].($_strVal[$i] ^ $encrypt_key[$ctr++]);
        }

        // 返回结果,结果为 passport_key() 函数返回值的 base65 编码结果
        return base64_encode(self::doOp($tmp, $_strKey));

    }

    /**
     * Passport 解密函数
     *
     * @param    string     加密后的字串
     * @param    string     私有密匙(用于解密和加密)
     *
     * @return    string     字串经过私有密匙解密后的结果
     */
    public static function decode( $_strVal = "" , $_strKey = "" )
    {

        // $_strVal 的结果为加密后的字串经过 base64 解码,然后与私有密匙一起,
        // 经过 passport_key() 函数处理后的返回值
        $_strVal = self::doOp(base64_decode($_strVal), $_strKey);

        // 变量初始化
        $tmp = '';

        // for 循环,$i 为从 0 开始,到小于 $_strVal 字串长度的整数
        for ($i = 0; $i < strlen($_strVal); $i++)
        {
            // $tmp 字串在末尾增加一位,其内容为 $_strVal 的第 $i 位,
            // 与 $_strVal 的第 $i + 1 位取异或。然后 $i = $i + 1
            $tmp .= $_strVal[$i] ^ $_strVal[++$i];
        }

        // 返回 $tmp 的值作为结果
        return $tmp;

    }

    /**
     * Passport 密匙处理函数
     *
     * @param    string     待加密或待解密的字串
     * @param    string     私有密匙(用于解密和加密)
     *
     * @return    string     处理后的密匙
     */
    public static function doOp( $_strVal = "" , $_strKey = "" )
    {    
        // 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值
        $strKey = md5( $_strKey );

        // 变量初始化
        $ctr = 0;
        $tmp = '';

        // for 循环,$i 为从 0 开始,到小于 $_strVal 字串长度的整数
        for($i = 0; $i < strlen($_strVal); $i++) {
            // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零
            $ctr = $ctr == strlen($strKey) ? 0 : $ctr;
            // $tmp 字串在末尾增加一位,其内容为 $_strVal 的第 $i 位,
            // 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1
            $tmp .= $_strVal[$i] ^ $strKey[$ctr++];
        }

        // 返回 $tmp 的值作为结果
        return $tmp;
    }

//end class
}

本文转载自:http://www.eiodesign.com/archives/182

w
粉丝 6
博文 71
码字总数 7984
作品 0
无锡
私信 提问
iOS 关于CommonCrypto加密 ②(CommonCryptor AES|DES|3DES|CAST|BlowFish)

在上一部分概述中概括介绍了中每个文件大致的内容,那么下面详细介绍第一个文件CommonCryptor的具体使用以及相关内容。示例代码请前往Github CommonCrypto下载。 CommonCryptor 苹果官方对C...

_涼城
2018/05/27
0
0
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(8)----非对称加密、BASE64加密、MD5等常用加密处理

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。 本篇继续继续整理优化已有的共用类库,并继续发表随笔介绍公...

长平狐
2012/06/11
170
0
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(8)----非对称加密、BASE64加密、MD5等常用加密处理

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。 本篇继续继续整理优化已有的共用类库,并继续发表随笔介绍公...

长平狐
2012/08/22
141
0
先进的微软视窗软件保护系统WinLicense

Themida是先进的微软视窗软件保护系统,专为了那WinLicense 结合了 Themida 保护功能以及高级注册管制。它提供了最强和具伸缩性的技术,使开发者可以安全地分发他们软件的试用版和完全版。 ...

baobiaokongjian
2014/04/22
0
0
关于“Postfix+Dovecot+MySQL搭建邮件服务器”中MySQL加解密的请教

@巴拉提 你好,想跟你请教个问题:我按照你的文章,一步一步学着做,真是知其然不知其所以然,好在配置过程中没有怎么报错,但我知道最终是要出问题的,现在全部配置完了,不能用mysql加用户...

老不懂
2016/03/27
455
0

没有更多内容

加载失败,请刷新页面

加载更多

UserInputControls用户输入控制

enum UserInputControls { kGovernedByOrthoMode = 0x0001,//正交模式管理 kNullResponseAccepted = 0x0002,//允许输入空 kDontEchoCancelForCtrlC = 0x0004,//ctrl C 模式不能重复......

一个小妞
11分钟前
0
0
分布式系统的事务处理

当我们在生产线上用一台服务器来提供数据服务的时候,我会遇到如下的两个问题: 1)一台服务器的性能不足以提供足够的能力服务于所有的网络请求。 2)我们总是害怕我们的这台服务器停机,造成...

群星纪元
13分钟前
0
0
Kanban VS Scrum:哪个是最好的敏捷项目管理框架

“我们使用敏捷开发。”在与软件开发团队交流时,你会听到很多这样的说法。根据统计,2018年全球约有90%的开发人员在使用敏捷开发。Choerodon猪齿鱼团队也是其中之一。 但是,敏捷并不统一。...

Choerodon
17分钟前
0
0
vue select 慢一步

我在使用vue的select的时候,@change事件里面,写一个axios拿到数据,然后修改某个变量,按理修改变量会立即呈现在页面上面,但实际情况是,值是变更了,但是页面上的效果慢了一步,非常奇怪...

朝如青丝暮成雪
22分钟前
0
0
分布式架构 核心知识体系

1.问题 1、何为分布式何为微服务? 2、为什么需要分布式? 3、分布式核心理论基础,节点、网络、时间、顺序,一致性? 4、分布式是系统有哪些设计模式? 5、分布式有哪些类型? 6、如何实现分...

小刀爱编程
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部