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

PHP Custom two way encryption and decryption , what i am doing wrong?

我正在尝试 obfuscate/encrypt 一个数字到字符串中,然后再次想要 de-ubfuscate/decrypt 该字符串以获得一个数字。

我不能使用 base64 或任何其他 public 可用算法,因为生成的哈希将是个人的并且特定于每个用户并且不能与其他用户共享,它用于创建包含个人的个人 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;
}?>

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

但多次迭代哈希的解密不起作用,它仅适用于单个加密值而不适用于 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;
}?>

和我的多次迭代解码函数


让我们说 userid = 41;

所以当我这样做时

<?php
$userid = 41;
echo userid_to_hash($userid)."<br>";
?>

我得到输出

g57p69f74a63p69l71

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

<?php
$hash = 'g57p69f74a63p69l71';
echo hash_to_userid($hash);
?>

我得到空白的白页。但是如果我像这样将 $hash 设置为单级解密并使用 自定义函数 my_custom_decode 那么它可以很好地进行单次迭代。

<?php
$hash = 't67';
echo my_custom_decode($hash);
?>

给出正确的输出。 9

"PHP Custom two way encryption and decryption", what i am doing wrong?

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

您应该考虑使用加密库。

您问题的答案是因为您使用的是全局变量。

这样做确实是一种不好的做法:

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

你一直翻转数组,在你的第二个循环中(当你尝试解码时),它找不到密钥了,因为你翻转了它两次。

丑陋的快速修复,只需重命名 my_custom_decode 中的数组变量。

i cant use base64 or any other public available algorithmbs as the generated hash is gonna be personal and specific to each user and cant be shared with other users, its for creating personal urls which will contains the personal hash.

你错过了加密的要点:

  • 算法应该 public 并且经过充分研究。
  • 密钥应该保密。

为此:Recommended PHP cryptography libraries

编辑 2017-10-17:

its for creating personal urls which will contains the personal hash.

抱歉,我在最初的回答中不知为何漏掉了你问题的这一部分。

加密甚至不是 obfuscating database IDs from GET requests 工作的正确工具。您想改用随机生成的令牌/单独查找。