本类是把原32位md5字符串通过加盐与对应密码本的方式加长为128位新密文,从而实现md5基础上的再加密。
<?php
//密码加密传输,所有的md5密码按照此类转换后再进行传输!
class PasswordMd5Api{
private $key_map;
private $letter_map;
private $range_map;
public function __construct(){
$this->key_map = array(
'0'=>array('c','9'),
'1'=>array('a','h'),
'2'=>array('d','i'),
'3'=>array('e','j'),
'4'=>array('f','k'),
'5'=>array('z','o'),
'6'=>array('x','p'),
'7'=>array('u','q','6'),
'8'=>array('s','r','7'),
'9'=>array('l','v'),
'a'=>array('n','w','3'),
'b'=>array('m','5'),
'c'=>array('g','y',),
'd'=>array('t','0'),
'e'=>array('4','1'),
'f'=>array('b','2','8'),
);
$this->letter_map = array(
'c'=>'0','9'=>'0',
'a'=>'1','h'=>'1',
'd'=>'2','i'=>'2',
'e'=>'3','j'=>'3',
'f'=>'4','k'=>'4',
'z'=>'5','o'=>'5',
'x'=>'6','p'=>'6',
'u'=>'7','q'=>'7','6'=>'7',
's'=>'8','r'=>'8','7'=>'8',
'l'=>'9','v'=>'9',
'n'=>'a','w'=>'a','3'=>'a',
'm'=>'b','5'=>'b',
'g'=>'c','y'=>'c',
't'=>'d','0'=>'d',
'4'=>'e','1'=>'e',
'b'=>'f','2'=>'f','8'=>'f'
);
$this->range_map = array_merge(range(0,9),range('a','z'));//创建包含有0~9,a~z的数组
}
/**
* 用md5密码生成出传输用的密码
* @param string $md5_string 原始md5密码
* @return string $new_md5_string 传输用的密码
*/
public function createMd5($md5_string){
$this->randKeyMap();
$new_md5_string = '';
for($i=0;$i<32;$i++){
$new_md5_string .= $this->getSalt().$this->key_map[$md5_string[$i]];
}
return $new_md5_string;
}
/**
* 生成随机密码本
*/
private function randKeyMap(){
$tmp_map = array();
foreach ($this->key_map as $key => $value) {
$tmp_map[$key] = $value[rand(0,count($value)-1)];
}
$this->key_map = $tmp_map;
}
/**
* 生成盐,生成方式,随机的3位
*/
private function getSalt(){
$salt = '';
for($i=0;$i<3;$i++){
$salt .= $this->range_map[rand(0,count($this->range_map) - 1)];
}
return $salt;
}
/**
* 将传输用的密码解析为原始的md5密码
* @param string $need_parse_md5_string 传输的密码
* @return string $md5_string 解析后的密码
*/
public function parseMd5($need_parse_md5_string){
$md5_string = '';
$len = strlen($need_parse_md5_string);
$parse_string = '';
for($i=0;$i<$len;$i+=4){
$parse_string .= substr($need_parse_md5_string,($i+3),1);//每四位截取1位得出32位密文
}
for($i=0;$i<32;$i++){
$md5_string .= $this->letter_map[$parse_string[$i]];//通过密码本解析出实际的32位MD5原文
}
return $md5_string;
}
}