0

我正在寻找将数字(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] OK
[101] [Y5WKH7J1+k0bFqsGw1jmrA==] [101] OK
[102] [NqV2opJc7CNq5O3lcuWKMw==] [102] OK
[103] [1FpJhHe+vrK6aKA54VR53Q==]100Q ] OK
[104] [MHQoYCqL4yCI9jKg1U0UYw==] [104] OK
[105] [6Qq9aXEn46xpDgv8CvnK7Q==] [105] OK
[106] [UGk1/byT7wpoFM59Uy/pdg==] [106] OK
[107] [39kyPA49zAZsCFx3ptbYw=] [107] 好的
[108] [YccDSimEf3C0NKDaVOf4kA==] [108] 好的
[109] [PfmvLfVR4+gi9y9v/6efZQ==] [109] 好的
***** 好的 ******

字符串看起来是随机的(除了==末尾的)并且大小都相同。不是完美的解决方案,但足够好!

谢谢你们 !!

4

5 回答 5

2

您可以使用 PHP 的一种加密函数 ( mcrypt ) 来加密您的数据,然后使用base64_encode将其编码为可以作为文本发送的字符串。

于 2010-08-06T06:10:05.443 回答
0

base64_encodebase64_decode

于 2010-08-06T06:09:16.110 回答
0

看看Crypt_XXTEA梨包。您可以使用它加密/解密任意字符串。它使用 XXTEA 分组密码算法(参见 Wikipedia 上的 XXTEA)。如果你想要一个“漂亮”的格式,你可以另外对加密的输出进行 uuencode。

于 2010-08-06T06:16:12.147 回答
0

使用像 rot13 这样简单的东西,并为每个数字附加一组额外的字符。是的,这是一种非常弱的加密形式,但它解决了问题,您可以使输出匹配您想要的任何内容。

如果用户想要更复杂的东西,请尝试使用 tweber's answer ,但是您无法真正控制字符串输出的长度或随机性。

于 2010-08-06T06:21:49.127 回答
-3

您可以将sha1函数 用于编码所需的目的,请检查:http: //php.net/manual/en/function.sha1.php 或者您也可以使用此链接

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

于 2010-08-06T06:01:57.347 回答