Как кодировать номер в строке, а потом декодировать его? - PullRequest
0 голосов
/ 06 августа 2010

Я ищу функции шифрования / дешифрования, которые будут кодировать числа (0, 1, 2, ...) в строки, так что эти строки будут выглядеть случайными, а затем число можно будет декодировать обратно из строки.

Например: 3 будет зашифровано в ABFQWEMasdEE, а 6 будет зашифровано в poad_Asd#@sad.

Если бы я мог контролировать количество символов в зашифрованной строке, а также какие символыможет появиться там, это может быть здорово!

ОБНОВЛЕНИЕ

Я в конечном итоге с этим решением:

<?php    

$key = 'secret_password';

for ($i = 100; $i < 110; $i++) {
    $text = "$i";
    $encrypted = encrypt($text, $key);
    $decrypted = decrypt($encrypted, $key);
    $decrypted = rtrim($decrypted, "\0");
    $ok = ($text === $decrypted);
    if (!$ok) {
        exit('********** BUG BUG BUG BUG BUG ***********');
    }
    echo '[' . $text . '] [' . $encrypted . '] [' . $decrypted . '] ' . ($ok ? 'OK' : 'BUG BUG BUG BUG BUG BUG BUG') . '<br />';
}
exit('***** OK ******');

function encrypt($data, $key) {     
    $td = mcrypt_module_open('cast-256', '', 'ecb', '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $encrypted_data = mcrypt_generic($td, $data);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return base64_encode($encrypted_data);
}   

function decrypt($encoded_64, $key) {
    $td = mcrypt_module_open('cast-256', '', 'ecb', '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $decrypted_data = mdecrypt_generic($td, base64_decode($encoded_64));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $decrypted_data;
}  

?>

, который обеспечивает следующий вывод:

[100] [9UA0Maq3MGp0CzMOWcpOpg ==] [100] ОК[101] [Y5WKH7J1 + k0bFqsGw1jmrA ==] [101] ОК[102] [NqV2opJc7CNq5O3lcuWKMw ==] [102] ОК[103] [1FpJhHe + vrK6aKA54VR53Q ==] [103] ОК[104] [MHQoYCqL4yCI9jKg1U0UYw ==] [104] ОК[105] [6Qq9aXEn46xpDgv8CvnK7Q ==] [105] ОК[106] [UGk1 / byT7wpoFM59Uy / pdg ==] [106] ОК[107] [39kyPA49zAZsCFx3pt6bYw ==] [107] ОК[108] [YccDSimEf3C0NKDaVOf4kA ==] [108] ОК[109] [PfmvLfVR4 + gi9y9v / 6efZQ ==] [109] ОК***** ХОРОШО ******

Строки выглядят случайными (за исключением == в конце) и все одинакового размера.Не идеальное решение, но достаточно хорошее!

Спасибо всем !!

Ответы [ 5 ]

2 голосов
/ 06 августа 2010

Вы можете использовать одну из функций шифрования PHP ( mcrypt ) для шифрования ваших данных, а затем использовать base64_encode для кодирования их в строку, которую можно отправить в виде текста.

0 голосов
/ 06 августа 2010

Используйте что-нибудь простое, например, rot13 и добавьте дополнительный набор символов к каждому номеру. Да, это действительно слабая форма шифрования, но она решает вопрос, и вы можете сделать вывод таким, как вам нужно.

Если пользователь хочет что-то более сложное, попробуйте использовать ответ Тивера, но тогда вы не сможете реально контролировать длину или случайность вывода строки.

0 голосов
/ 06 августа 2010

Посмотрите на пакет Crypt_XXTEA Pear. Вы можете зашифровать / расшифровать произвольные строки с ним. Он использует алгоритм блочного шифра XXTEA (см. XXTEA в Википедии). Если вы хотите иметь «хороший» формат, вы можете дополнительно закодировать зашифрованный вывод.

0 голосов
/ 06 августа 2010

посмотрите на base64_encode и base64_decode.

0 голосов
/ 06 августа 2010

вы можете использовать для нужного кодирования sha1 функции Проверь это: http://php.net/manual/en/function.sha1.php или вы можете использовать эту ссылку тоже

http://php.net/manual/en/function.crypt.php

...