strtr()解密错误???

<?php $from='gh'; $to='kp'; $to1="fdfd"; $str3='ghjkl'; $security_str3=strtr($str3,$from,$to);//语句加密 echo "输出加密语句:$security_str3
"; $new_str3=strtr($security_str3,$to,$from);//语句解密 echo "解密后语句:$new_str3"; if($new_str3==$str3){ echo "解密成功:$str3"; }else echo "
密码错误,请重新输入"; ?>

//$new_str3=strtr($security_str3,$to,$from);//语句解密 此语句解密 为什么$new_str3的值不是等于$str3呢感谢回复!!!

最佳答案

确实想这么做的话,可以用下面这个函数代替strtr


function superStrtr($str,$from,$to){
        $from=str_split($from);
        $to=str_split($to);

        if(count($from)!=count($to)){
            throw new Exception('from和to长度不一致');
        }

        if(array_intersect($from,$to)){
            throw new Exception('from和to不能包含相同字符');
        }

        if(count(array_unique($from)) != count($from)){
            throw new Exception('from包含重复字符');
        }
        if(count(array_unique($to)) != count($to)){
            throw new Exception('to包含重复字符');
        }

        $str=str_split($str);
        $fromMap=array_fill_keys($from,[]);
        $toMap=array_fill_keys($to,[]);
        foreach ($str as $i=>$v){
            if(isset($fromMap[$v])){
                $fromMap[$v][]=$i;
            }
            if(isset($toMap[$v])){
                $toMap[$v][]=$i;
            }
        }
        foreach ($from as $i=>$f){
            $indexList=$fromMap[$f];
            if($indexList){
                $t=$to[$i];
                foreach ($indexList as $index){
                    $str[$index]=$t;
                }
            }
        }
        foreach ($to as $i=>$t){
            $indexList=$toMap[$t];
            if($indexList){
                $f=$from[$i];
                foreach ($indexList as $index){
                    $str[$index]=$f;
                }
            }
        }
        return implode('',$str);
    }
1周前 评论
james168 (楼主) 1周前
james168 (楼主) 1周前
renxiaotu (作者) 1周前
renxiaotu (作者) 1周前
讨论数量: 12

建议你整理好代码格式

1周前 评论

逐步打印分析

1周前 评论
zhuzixian520

它是按字符匹配的,from to 你这个都是两个字符,其实是一一对应的,第三个参数多了,也只取第二个参数的长度

1周前 评论

这逻辑太逗了,怎么能这么做加密解密呢

举个例子:

原始字符串:10101

把所有1变成0后:00000

把所有0变成1后:11111

这种逻辑肯定不能用来加密解密吧,怎么可能得出原来的值

1周前 评论
james168 (楼主) 1周前

可逆的加解密人家都已有成熟的算法了, 还要自己搞

1周前 评论

确实想这么做的话,可以用下面这个函数代替strtr


function superStrtr($str,$from,$to){
        $from=str_split($from);
        $to=str_split($to);

        if(count($from)!=count($to)){
            throw new Exception('from和to长度不一致');
        }

        if(array_intersect($from,$to)){
            throw new Exception('from和to不能包含相同字符');
        }

        if(count(array_unique($from)) != count($from)){
            throw new Exception('from包含重复字符');
        }
        if(count(array_unique($to)) != count($to)){
            throw new Exception('to包含重复字符');
        }

        $str=str_split($str);
        $fromMap=array_fill_keys($from,[]);
        $toMap=array_fill_keys($to,[]);
        foreach ($str as $i=>$v){
            if(isset($fromMap[$v])){
                $fromMap[$v][]=$i;
            }
            if(isset($toMap[$v])){
                $toMap[$v][]=$i;
            }
        }
        foreach ($from as $i=>$f){
            $indexList=$fromMap[$f];
            if($indexList){
                $t=$to[$i];
                foreach ($indexList as $index){
                    $str[$index]=$t;
                }
            }
        }
        foreach ($to as $i=>$t){
            $indexList=$toMap[$t];
            if($indexList){
                $f=$from[$i];
                foreach ($indexList as $index){
                    $str[$index]=$f;
                }
            }
        }
        return implode('',$str);
    }
1周前 评论
james168 (楼主) 1周前
james168 (楼主) 1周前
renxiaotu (作者) 1周前
renxiaotu (作者) 1周前

感谢大家的回复,我会认真大家给我的回复。谢谢大家

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!