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
| 归档时间: |
|
| 查看次数: |
2323 次 |
| 最近记录: |