Php 如何对字符串中的数字进行编码,然后对其进行解码?
我正在寻找加密/解密功能,将编码数字0,1,2。。。转换为字符串,使这些字符串看起来是随机的,然后数字可以从字符串中解码回来 例如:3将加密为ABFQWEMasdEE,6将加密为poad_Asd@sad. 如果我能控制加密字符串中的字符数,以及哪些字符可以出现在那里,那就太棒了 更新 我最终得到了这个解决方案:Php 如何对字符串中的数字进行编码,然后对其进行解码?,php,encoding,encryption,decoding,Php,Encoding,Encryption,Decoding,我正在寻找加密/解密功能,将编码数字0,1,2。。。转换为字符串,使这些字符串看起来是随机的,然后数字可以从字符串中解码回来 例如:3将加密为ABFQWEMasdEE,6将加密为poad_Asd@sad. 如果我能控制加密字符串中的字符数,以及哪些字符可以出现在那里,那就太棒了 更新 我最终得到了这个解决方案: <?php $key = 'secret_password'; for ($i = 100; $i < 110; $i++) { $text = "$i"
<?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][9ua0maq3mgp0czmowcopg=][100]正常
[101][Y5WKH7J1+k0bFqsGw1jmrA==][101]正常
[102][NqV2opJc7CNq5O3lcuWKMw==][102]正常
[103][1FPJHE+vrK6aKA54VR53Q=][103]好的
[104][MHQoYCqL4yCI9jKg1U0UYw==][104]正常
[105][6Qq9aXEn46xpDgv8CvnK7Q==][105]正常
[106][UGk1/byT7wpoFM59Uy/pdg==][106]正常
[107][39kyPA49zAZsCFx3pt6bYw=][107]好的
[108][YccDSimEf3C0NKDaVOf4kA=][108]好的
[109][PfmvLfVR4+gi9y9v/6efZQ==][109]正常
*****嗯******
字符串看起来是随机的,除了结尾的==和大小相同的字符串。不是完美的解决方案,但已经足够好了
谢谢大家 您可以使用sha1函数进行编码 选中此项: 或者你也可以使用这个链接
查看base64_encode和base64_decode。您可以使用PHP的一个加密函数对数据进行加密,然后使用将其编码为可以作为文本发送的字符串。查看Pear包。您可以使用它加密/解密任意字符串。它使用XXTEA分组密码算法参见维基百科上的XXTEA。如果你想有一个好的格式,你可以对加密的输出进行额外的UU编码。使用类似rot13的简单方法,并在每个数字上附加一组额外的字符。是的,这是一种非常弱的加密形式,但它解决了这个问题,您可以使输出匹配您想要的任何内容
如果用户想要更复杂的内容,请尝试使用tweber的答案,但这样就无法真正控制字符串输出的长度或随机性。将任意长度的输入转换为固定长度的输出通常是哈希函数的属性,而不是加密函数。哈希函数通常不是双射函数。他想要的东西是可逆的。@Amadan是的,可逆加密通常不是固定长度的。检查这个问题:@deceze:我不确定找不到方案。显然,固定长度的密码文本对编码的数字施加了限制。例如,如果您将0-255转换为000-255或00000000-11111111,则会得到固定长度的明文,因此期望固定长度的密码文本并非不合理。诀窍在于如何使它看起来足够随机,而且是可逆的。我的数学能力很弱。答案只是为了编码。OP特别要求一个可以反转的函数。散列!=编码!=加密。这是三个不同的概念,不能被视为可互换的。当您可以使用像Rijndael AES这样经过验证的方案时,为什么要使用它呢?并不是说XXTEA不好,它只是不像AES那样经过战斗考验。多字母密码是个糟糕的主意。