【php】数据加密与解密

最近突发奇想,想实现一个小功能,(具体的保密,呵呵~)
其中一段我想用 数据加密来实现,但是这个并不是像md5那样单xiang的,因为我只是想在传输过程中 加密,而传输到了后再进行 解密。而且我并不想在服务器端装什么组件。所以就...........研究.............了一下,没有结果。
哈哈,就问了一下haohappy这个php高手。
结果得到了如下函数:
base64_encode()
base64_decode()
实验了一下,挺符合我的要求的,有空再给他加个私钥,就很完美了~~~
其实,以前在研究php发信的时候就有碰到过这个函数,PHPsocket发信的title部分当出现中文的时候,就是用base64_encode来解决乱码的问题的。呵呵。
顺便列一下haohappy提供的另外几个函数,(虽然不符合我的要求)
rawurldecode -- 对已编码的 URL 字符串进行解码
rawurlencode -- 按照 RFC 1738 对 URL 进行编码
urldecode -- 解码已编码的 URL 字符串
urlencode -- 编码 URL 字符串
BTW:在刚才调试的工程中,感觉似乎迅雷的下载地址也是base64加密的,很you可能。有空研究一下看看。。:)
BTW2:再仔细看了一下,想起来以前有个东东提供带密钥的base64来着,仔细baidu了一下下,发现原来是这里
代码如下:
<?
        /**
        * Passport 加密函数
        *
        * @param                string          等待加密的原字串
        * @param                string          私有密匙(用于解密和加密)
        *
        * @return       string          原字串经过私有密匙加密后的结果
        */
        function passport_encrypt($txt, $key) {

                // 使用随机数发生器产生 0~32000 的值并 MD5()
                srand((double)microtime() * 1000000);
                $encrypt_key = md5(rand(0, 32000));

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

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

                // 返回结果,结果为 passport_key() 函数返回值的 base64 编码结果
                return base64_encode(passport_key($tmp, $key));

        }

        /**
        * Passport 解密函数
        *
        * @param                string          加密后的字串
        * @param                string          私有密匙(用于解密和加密)
        *
        * @return       string          字串经过私有密匙解密后的结果
        */
        function passport_decrypt($txt, $key) {

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

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

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

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

        }

        /**
        * Passport 密匙处理函数
        *
        * @param                string          待加密或待解密的字串
        * @param                string          私有密匙(用于解密和加密)
        *
        * @return       string          处理后的密匙
        */
        function passport_key($txt, $encrypt_key) {

                // 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值
                $encrypt_key = md5($encrypt_key);

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

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

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

        }

        /**
        * Passport 信息(数组)编码函数
        *
        * @param                array           待编码的数组
        *
        * @return       string          数组经编码后的字串
        */
        function passport_encode($array) {

                // 数组变量初始化
                $arrayenc = array();

                // 遍历数组 $array,其中 $key 为当前元素的下标,$val 为其对应的值
                foreach($array as $key => $val) {
                        // $arrayenc 数组增加一个元素,其内容为 "$key=经过 urlencode() 后的 $val 值"
                        $arrayenc[] = $key.'='.urlencode($val);
                }

                // 返回以 "&" 连接的 $arrayenc 的值(implode),例如 $arrayenc = array('aa', 'bb', 'cc', 'dd'),
                // 则 implode('&', $arrayenc) 后的结果为 ”aa&bb&cc&dd"
                return implode('&', $arrayenc);

        }
?>
这段代码 非常神奇支持私钥,可以 加密的同时还能做到 解密,而且他的 加密结果居然 唯一的。
例如:
数据:iloveu
钥匙:really?
加密结果: CzcIMAA5WHEEYFl8
           BzsDO1JrXHUEYFN2
           Az8FPVVsDCVSNlVw
           BjoAOFJrCyJRNQQh
          CjYJMVBpDyZQNFh9
          ................
强烈推荐~~~~~~~~~~~~~~~

转载于:https://www.cnblogs.com/cnteam/articles/4240896.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值