【原创】将15位数字密码转化为10位密码
实现原理:将3个数字转化成2个字母表达,三个数字最多1000种可能,但是两个字母(包括大小写)随机组合,可以有2704种可能,相互之间形成一一对照,就可以将15位的数字密码转化为10位密码。代码如下:
// 52位字母字符串 $str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; $total = strlen($str); // 52位 $enrule = array(); $derule = array(); // 生成字典库对照表 for($i=0; $i<1000; $i++){ $temp = substr($str,mt_rand(0,51),1).substr($str,mt_rand(0,51),1); if(!in_array($temp,$enrule)){ $enrule[$i] = $temp; }else{ $i--; } } // 键值反转,用于解密用 $derule = array_flip($enrule); // 将字典库放入缓存当中 $cache_enrule = Cache::get('enrule'); $cache_derule = Cache::get('derule'); if(!$cache_enrule || !$cache_derule){ // 有一个不存在,就重新缓存 Cache::set('enrule',$enrule,3600); Cache::set('derule',$derule,3600); } $test = '728937986743876'; // 15位数字 var_dump('原始密码:'.$test); // 开始加密 $temp_test = chunk_split($test,'3',','); $temp_arr = explode(',',trim($temp_test,',')); $new_str = ''; foreach($temp_arr as $k=>$v){ $new_str .= $cache_enrule[$v]; } var_dump('压缩密码:'.$new_str); // 开始解密,与加密原理差不多 $detemp_test = chunk_split($new_str,'2',','); $detemp_arr = explode(',',trim($detemp_test,',')); $old_str = ''; foreach($detemp_arr as $k=>$v){ $old_str .= $cache_derule[$v]; } var_dump('解密密码:'.$old_str);
输出结果为:
string ‘原始密码:728937986743876’ (length=30)
string ‘压缩密码:FPYyUfEnGO’ (length=25)
string ‘解密密码:728937986743876’ (length=30)