【原创】将15位数字密码转化为10位密码

【原创】将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)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据