PHP自定义双向加密和解密,我做错了什么?

AMB*_*AMB -4 php encryption hash cryptography

我试图将一个数字混淆/加密成字符串,然后再次想要对该字符串进行解复用/解密以获得一个数字.

我不能使用base64或任何其他公共可用的算法,因为生成的哈希将是个人的并且特定于每个用户并且不能与其他用户共享,其用于创建将包含个人哈希的个人URL.

基本上我想从userid生成哈希,因为userid是唯一的并且没有变化.

到目前为止,我已经创建了自定义函数来加密用户ID并从中获取哈希值.

<?php
$base_encryption_array = array(
'0'=>'b76',
'1'=>'d75',
'2'=>'f74',
'3'=>'h73',
'4'=>'j72',
'5'=>'l71',
'6'=>'n70',
'7'=>'p69',
'8'=>'r68',
'9'=>'t67',
'a'=>'v66',
'b'=>'x65',
'c'=>'z64',
'd'=>'a63',
'e'=>'d62',
'f'=>'e61',
'g'=>'h60',
'h'=>'i59',
'i'=>'j58',
'j'=>'g57',
'k'=>'f56',
'l'=>'c55',
'm'=>'b54',
'n'=>'y53',
'o'=>'w52',
'p'=>'u51',
'q'=>'s50',
'r'=>'q49',
's'=>'o48',
't'=>'m47',
'u'=>'k46',
'v'=>'i45',
'w'=>'g44',
'x'=>'e43',
'y'=>'c42',
'z'=>'a41'
);

function my_custom_encode($string){
global $base_encryption_array ;
$string = (string)$string;
$length = strlen($string);
$hash = '';
    for ($i=0; $i<$length; $i++) {
        if(isset($string[$i])){
            $hash .= $base_encryption_array[$string[$i]];
        }
    }
return $hash;
}


function my_custom_decode($hash){
global $base_encryption_array ;
/* this makes keys as values and values as keys */
$base_encryption_array = array_flip($base_encryption_array);

$hash = (string)$hash;
$length = strlen($hash);
$string = '';

    for ($i=0; $i<$length; $i=$i+3) {
        if(isset($hash[$i]) && isset($hash[$i+1]) && isset($hash[$i+2]) && isset($base_encryption_array[$hash[$i].$hash[$i+1].$hash[$i+2]])){
            $string .= $base_encryption_array[$hash[$i].$hash[$i+1].$hash[$i+2]];
        }
    }
return $string;
}?>
Run Code Online (Sandbox Code Playgroud)

到目前为止一切正常.加密适用于多个级别/迭代.

bu多个迭代哈希的解密不起作用,它只适用于单个加密值而不适用于2倍加密值.

例如.我的php函数从userid创建多个迭代哈希,我使用2次这样的加密.

<?php
function userid_to_hash($userid){
    for($i = 1; $i <= 2; $i++) {
        $userid = my_custom_encode($userid);
    }

/* it returns hash*/
return $userid;
}?>
Run Code Online (Sandbox Code Playgroud)

和我的多次迭代解码功能


让我们说userid = 41;

所以当我这样做

<?php
$userid = 41;
echo userid_to_hash($userid)."<br>";
?>
Run Code Online (Sandbox Code Playgroud)

我得到输出

g57p69f74a63p69l71

但是,当我想解密哈希并获得用户ID时,我得到空白.像这样

<?php
$hash = 'g57p69f74a63p69l71';
echo hash_to_userid($hash);
?>
Run Code Online (Sandbox Code Playgroud)

我得到空白的白页.但是如果我将$ hash设置为这样的单级解密并使用自定义函数my_custom_decode,那么它适用于单次迭代.

<?php
$hash = 't67';
echo my_custom_decode($hash);
?>
Run Code Online (Sandbox Code Playgroud)

给出正确的输出. 9

Sar*_*ara 22

"PHP自定义双向加密和解密", 我做错了什么?

您正在尝试编写自定义加密.


Sco*_*ski 8

我不能使用base64或任何其他公共可用的算法,因为生成的哈希将是个人的并且特定于每个用户并且不能与其他用户共享,其用于创建将包含个人哈希的个人URL.

您错过了加密点:

  • 算法应该公开并且经过充分研究.
  • 按键应当保密.

为此:推荐的PHP加密库.

编辑2017-10-17:

它用于创建包含个人哈希的个人URL.

对不起,我在最初的答案中错过了这部分问题.

加密甚至不是从GET请求混淆数据库ID的正确工具.您想要使用随机生成的令牌/单独查找.