PHP加密解密内部算法

<?php
function passport_encrypt($txt, $key) {
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000));
$ctr = 0;
$tmp = '';
for($i = 0;$i < strlen($txt); $i++) {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
}
return base64_encode(passport_key($tmp, $key));
}

function passport_decrypt($txt, $key) {
$txt = passport_key(base64_decode($txt), $key);
$tmp = '';
for($i = 0;$i < strlen($txt); $i++) {
$md5 = $txt[$i];
$tmp .= $txt[++$i] ^ $md5;
}
return $tmp;
}

function passport_key($txt, $encrypt_key) {
$encrypt_key = md5($encrypt_key);
$ctr = 0;
$tmp = '';
for($i = 0; $i < strlen($txt); $i++) {
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}
?>
以下是一些示例…加深对这三个加密解密函数的理解…
//string.php
<?php
include “fun.php”;

$txt = “This is a test”;
$key = “testkey”;
$encrypt = passport_encrypt($txt,$key);
$decrypt = passport_decrypt($encrypt,$key);

echo $txt.”<br><hr>”;
echo $encrypt.”<br><hr>”;
echo $decrypt.”<br><hr>”;
?>
//array.php
<?php
include “fun.php”;

$array = array(
"a" => "1",
"b" => "2",
"c" => "3",
"d" => "4"
);
//serialize产生一个可存储的值,返回一个字符串,unserialize还原
$txt = serialize($array);
$key = “testkey”;
$encrypt = passport_encrypt($txt,$key);
$decrypt = passport_decrypt($encrypt,$key);
$decryptArray = unserialize($decrypt);

echo $txt.”<br><hr>”;
echo $encrypt.”<br><hr>”;
echo $decrypt.”<br><hr>”;
echo $decryptArray.”<br><hr>”;
?>
关键的地方来了…当你要跳转到另外一个网址,但又要保证你的session无误的时候,你需要对session作一个处理.貌似一个公司有一个网站又有一个论坛,两个地方都有注册和登录,但又不想让用户在主页登录后跳转到论坛的时候session失效,即是登录一次跑完整间公司…
那要怎样来处理用户的session呢…
网页都是无状态的,如果要在新的网页中继续使用session,则需要把session从一个地方移到另一个地方,可能有些人已经想到了,我可以通过url传址的方式来调用它….而PHP有个处理session的变量,叫$_SESSION.于是….
将需要注册的session转换成一个数组吧.那么,你可以这样写:
//login.php
<?php
session_start();
include “fun.php”;
….
$_SESSION[“userid”];
$_SESSION[“username”];
$_SESSION[“userpwd”];

header("Location: http://$domain/process.php?s=".urlencode(passport_encrypt(serialize($_SESSION),"sessionkey")));
?>
上例中先用serialize将$_SESSION变成可存储的数据,然后通过passport_encrypt将这个数据加密,加urlencode的原因是因为$_SESSION加密时,有可能会产生像料想不到的编码,所以以防万一…(事实证明非常有效)
处理下先
//process.php
<?php
session_start();
include “fun.php”;
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey"));
header("Location: http://$domain/index.php");
?>
先用$_GET[“s”]获取URL的参数,然后用passport_decrypt将其解密,再用unserialize将其数据还原成原始数据
到了这步处理,你的网页就可能通过header自由跳转啦….
这种方法还涉及到安全性的问题,如果你的url地址在传址的过程中被人家获取的话,那就真的是不好意思了…人家虽然可能破解不了url里边的内容,但人家也可以直接用这个url地址来登录你的一些个人账户啊,邮箱帐户啊甚至银行帐户(当然很少人会这样写,我例外,哈哈)…听起来好怕….但其实你可以在跳转页面作取消session处理….
以下是加强版的process.php
<?php
session_start();
include_once "fun.php";
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey"));
if((time()-$_SESSION["TIME"])>30){
header("Location: http://$domain/ login.php");
unset($_SESSION["USERNAME"]);
unset($_SESSION["PASSWORD"]);
}
else
header("Location: http://$domain/ index.php");
?>
写这个文件之前,你还要在登录那边设置
$_SESSION["TIME"] = time();
设置这个的原因主要是获取两边的时间,如果跳转的时候超过30秒的时候,你就可以让它跳转到login.php登录页面,网速慢的客户就不好意思啦…但这也预防了如果此url被人获取,而这个人又没有在30秒内登录的话,那就不好意思啊,超时重新登录.
$_SESSION["USERNAME"]和$_SESSION["PASSWORD"] 这两个东东就是用户登录时需要输入的用户名和密码了….取消这两个session的原因就是因为如果你的url被人获取了,那个人虽然在超过30秒内跳转到loign.php的页面,但那些传过来的session依然有效,只要将url后缀login.php改为index.php….那他一样登录成功…

时间: 2024-08-31 11:56:47

PHP加密解密内部算法的相关文章

PHP 加密解密内部算法_php技巧

将它们打包成一个文件就叫fun.php吧 复制代码 代码如下: <?php function passport_encrypt($txt, $key) { srand((double)microtime() * 1000000); $encrypt_key = md5(rand(0, 32000)); $ctr = 0; $tmp = ''; for($i = 0;$i < strlen($txt); $i++) { $ctr = $ctr == strlen($encrypt_key) ?

Windows 8 Store Apps学习(32) 加密解密: 非对称算法, 数据转换的辅助类

介绍 重新想象 Windows 8 Store Apps 之 加密解密 非对称算法(RSA) 签名和验证签名 (RSA) 通过 CryptographicBuffer 来实现 string hex base64 binary 间的相互转换 示例 1. 演示如何使用非对称算法(RSA) Crypto/Asymmetric.xaml.cs /* * 演示如何使用非对称算法(RSA) */ using System; using Windows.Security.Cryptography; using

重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类

原文:重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类 [源码下载] 重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 加密解密 非对称算法(RSA) 签名和验证签名(RSA) 通过 CryptographicBuffer 来实现 string hex base64 binary 间的相互转换 示

PHP实现加密解密算法

PHP实现加密解密的算法,如下代码: <?php    class Mcrypt    {        /**        * 解密        *         * @param string $encryptedText 已加密字符串        * @param string $key  密钥        * @return string        */        public static function _decrypt($encryptedText,$key =

Windows 8 Store Apps学习(31) 加密解密: 哈希算法, 对称算法

介绍 重新想象 Windows 8 Store Apps 之 加密解密 hash 算法(MD5, SHA1, SHA256, SHA384, SHA512) hmac 算法(MD5, SHA1, SHA256, SHA384, SHA512) 本地数据的加密解密 对 称算法(AES, DES, 3DES, RC2, RC4) 示例 1.演示如何使用 hash 算法(MD5, SHA1, SHA256, SHA384, SHA512) Crypto/Hash.xaml.cs /* * 演示如何使用

重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法

原文:重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法 [源码下载] 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 加密解密 hash 算法(MD5, SHA1, SHA256, SHA384, SHA512) hmac 算法(MD5, SHA1, SHA256, SHA384, SHA512) 本地数据的加密解

Base64加密解密算法的C/C++代码实现

这个Base64是从Live555的代码里面提取出来的,请大家放心使用吧.   Base64的加密解密的算法和原理我就不想说了...., 网上有很多介绍原理的文章. 这个算法有啥好处呢?  为什么我们要用它?   Base64算法不是为了防止内容被人破解而使用的算法, 因为破解Base64太容易了, 就是简单的字符替换.   Base64还有个不好的地方,就是加密后, 长度会变成.   那我们为何还要使用Base64 呢 ?  因为Base64可以把乱七八糟的二进制转化为字符串,这个特性在很多地

Android文件加密:加密解密出来文件打开有误。

问题描述 Android文件加密:加密解密出来文件打开有误. 使用CipherInputStream,CipherOutputStream对文件进行加密解密,对于jpg,tex,pdf文档都可以正常显示,但是对png,apk文件解密出来的文件打开不了,png提示没有缩略图,apk提示解析压缩包有误.所有加密解密文件大小基本没大的变化. 解决方案 如何加密解密文件Android AES 文件加密解密Android AES 文件加密解密 解决方案二: 直接比较加解密前后文件的md5等,看是否完全一致

VC对自定义资源加密解密(AES)的详解_C 语言

加密解密exe算法可能AES加密解密算法别人已经实现过,也有一些关于如何操纵自定义资源的VC代码,我只是将它们进行了组合,运用到了一起,并运用了一些操纵内存的小技巧,今天将以前做的这个功能总结了一下--在网上搜了一下,好像很少有相关的这种用法,算是原创吧,有兴趣的朋友可以看一下,以下是源码和EXE文件下载地址:点击下载 来两张截图: 图1-1 输出资自定义资源的内容,我的自定义资源是"TEXT" 图1-2 这是加密后再输出的结果