对PHP加密解密功能验证码使用详细的分析
康胜的验证码的功能可以说让在中国PHP社区的一大贡献。它包括康胜自己的产品,而中国大多数企业使用PHP这个函数加密。验证码的使用异或运算加密和解密。
其原理如下:
加密
明文:10101001
密钥:11100011
密文:01001010
为了得到密码01001010,解密的需要和秘密的秘密密钥将是可能的。
解密
密文:01001010
密钥:11100011
明文:10101001
没有高深度的算法,而密钥是非常重要的,所以关键是如何生成密钥。
所以让我们看看如何验证码可以一起做
复制代码代码如下所示:
参数解释
字符串:明文或密文
操作:解码说其他的解密,加密
密钥: $键
过期:有效密文
功能验证码($字符串操作= 'decode美元,美元关键=,= 0美元到期){
动态密钥长度,同一明文会产生不同的密文,是依靠动态密钥。
ckey_length = 4美元;
键
美元关键= MD5(美元美元美元关键关键:{ 'discuz_auth_key全局'});
密钥将参与加密和解密。
$科亚= MD5(substr($,0, 16));
该键将用于进行数据完整性验证。
$键盘= MD5(substr($,16, 16));
C/密文生成变化的关键
keyc = $($美元ckey_length操作= = 'decode'substr($字符串,0,ckey_length美元):
substr(MD5(瞬时()),至ckey_length)):;
参与键的操作
cryptkey = $(美元keya.md5科亚keyc美元美元。);
key_length美元= strlen($ cryptkey);
/ /明文,10节省时间戳之前,验证数据加密的有效性,10到26位来存储键盘美元(关键B),解密这个关键的数据完整性验证
如果是 / /解码,将开始从ckey_length美元,因为之前ckey_length美元拯救动态密钥的密文,确保正确的解密
$字符串操作= = 'decode'base64_decode美元(substr($字符串,ckey_length美元)):
sprintf(% 010d美元美元,到期届满+时间()():0)。Substr(MD5($字符串。$键盘),0, 16)。为字符串;
string_length美元= strlen($字符串);
结果=;
框=范围(0, 255);
rndkey美元=阵();
拥有/密钥簿
($ i = 0;$ i < 255;$ + +){
{ } =我rndkey美元美元ORD($ cryptkey { $ % $我key_length });
}
用固定的算法,破坏密钥本,增加随机性,看起来很复杂,实际上增加了密文的强度不是。
对于($ = $ I = 0;$ i < 256;$ + +){
J =(J + $盒{ $我} + $ rndkey { $我})% 256;
$ = $;
$;
$;
}
加密和解密的核心部分。
为($ = $ J = $我= 0;美元美元美元我<< string_length;i++){
$ =($ + 1)% 256;
$ =($ J $ +盒{ })% 256;
$ $ =;
$;
$;
从这本书中的关键字键或把它变成一个字符。
由于美元= CHR(ORD($字符串{我})^(合箱{(合箱{一} +美元美元箱{ $ J })% 256 }));
}
如果(= = 'decode操作美元){
/ / substr($,0, 10)数据有效性验证= = 0
/ / substr($,0, 10)时间(0)>有效性验证数据
/ / substr($,10, 16)= substr(MD5(substr($,26)美元的键盘),0, 16)来验证数据的完整性
验证数据 / /有效性,请参阅未加密的明文格式
如果((substr($,0, 10)= = 0 | | substr($,0, 10)-(时间)> 0)
substr($,10, 16)= substr(MD5(substr($,26)美元的键盘),0, 16)){
返回substr($,26);
{人}
返回' ';
}
{人}
密钥存储在动态密文中,这就是同一明文、密文解密可以产生不同的原因。
/ /因为加密的密文,可能是一些特殊的字符,复制过程可能会丢失,所以使用Base64编码
返回的keyc.str_replace(' = ',' ',base64_encode($结果));
}
}