【问题标题】:How to Encrypt & Decrypt Order of Array in Php如何在 PHP 中加密和解密数组的顺序
【发布时间】:2022-01-17 19:38:33
【问题描述】:

我想用 PHP 中的密钥加密订单。我的意思是我有一个这样的数组:

$arr=[5,"a","li",10];
$key="random";

$newOrder=encryptArr($arr,$key);   // [10,"li",5,"a"]

$original=decryptArr($newOrder,$key); //[5,"a","li",10]

【问题讨论】:

标签: php arrays encryption


【解决方案1】:

我们可以通过实现我们自己的 shuffle 来实现预期的结果,它使用从我们的密钥生成的预定种子派生的随机数。

function encryptArr(array $input, string $key): array
{
    $seed = makeSeed($key);
    $swaps = generateSwaps(count($input), $seed);

    return swapElements($input, $swaps);
}

function decryptArr(array $input, string $key): array
{
    $seed = makeSeed($key);
    $swaps = generateSwaps(count($input), $seed);
    // If we used the same seed when "encrypting",
    // then all we have to do is swap the shuffled array in reverse order.
    $swaps = array_reverse($swaps);

    return swapElements($input, $swaps);
}


/**
 * Helper function that converts string key into an int
 * by calculating crc32 polynomial from the string
 */
function makeSeed(string $key): int
{
    return crc32($key);
}

/**
 * We are using a predetermined $seed to generate a pairs of random numbers from 0 to $length-1
 * Eg. [[0, 0], [1, 3], [2, 3], [3, 3]]
 *
 */
function generateSwaps(int $length, int $seed): array
{
    $swaps = [];
    for ($i = 0; $i < $length; $i++) {
        mt_srand($seed+$i);
        $random_index = mt_rand(0, $length-1);
        $swaps[] = [$i, $random_index];
    }

    return $swaps;
}

function swapElements(array $input, array $swaps): array
{
    foreach ($swaps as $swap) {
        $tmp = $input[$swap[0]];
        $input[$swap[0]] = $input[$swap[1]];
        $input[$swap[1]] = $tmp;
    }

    return $input;
}

$arr=[5,"a","li",10];
$key="test";

$newOrder=encryptArr($arr,$key);
print_r($newOrder);

$original=decryptArr($newOrder,$key);
print_r($original);

输出

Array
(
    [0] => 5
    [1] => 10
    [2] => a
    [3] => li
)
Array
(
    [0] => 5
    [1] => a
    [2] => li
    [3] => 10
)

【讨论】:

  • 也许我们应该改进 makeSeed 功能。使用当前函数“test”和“estt”将产生相同的顺序,我们可以使用包含这些字符“tets,etst”等的任何单词来解密顺序......
  • 你是对的。在发布答案后也注意到了这一点。改进了 makeSeed 方法。
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2011-04-10
  • 2018-09-27
  • 2013-02-12
  • 2019-06-26
  • 1970-01-01
相关资源
最近更新 更多