Php将一个数字更改为另一个可以更改回原始数字的数字

时间:2013-09-23 18:02:33

标签: php encryption

使用PHP,我正在尝试将一个数字编码为另一个数字,我可以将其解码回原始数字。编码的字符串只需要是数字,不应包含任何其他内容。

例如:10变为573563547892或类似的东西。

如何在PHP中执行此类操作?我尝试了很多加密解密函数,但没有一个只输出数字。

我在一个不容易猜到的网页中寻找要使用的内容。

所以:http://www.me.com/index.PHP?page=20变为http://www.me.com/index.PHP?page=5705254782562466

2 个答案:

答案 0 :(得分:2)

为什么不在原始号码上使用mathematicat操作?例如x变为x * y + z。您只需要进行反向操作即可获得原始数字。考虑为y和/或z

使用足够大的素数

答案 1 :(得分:2)

使用ord&amp ;,加密相当重,但加密效果非常好chr一点。虽然这有效,但请考虑其他选项:只能使用字符串而不是数字已经使它更简单(base64_encode等):

<?php
class Crypter {
  private $key = '';
  private $iv = '';
  function __construct($key,$iv){
    $this->key = $key;
    $this->iv  = $iv;
  }
  protected function getCipher(){
     $cipher = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc','');
     mcrypt_generic_init($cipher, $this->key, $this->iv);
     return $cipher;
  }
  function encrypt($string){
     $binary = mcrypt_generic($this->getCipher(),$string);
     $string = '';
     for($i = 0; $i < strlen($binary); $i++){
        $string .=  str_pad(ord($binary[$i]),3,'0',STR_PAD_LEFT);
     }
     return $string;
  }
  function decrypt($encrypted){
     //check for missing leading 0's
     $encrypted = str_pad($encrypted, ceil(strlen($encrypted) / 3) * 3,'0', STR_PAD_LEFT);
     $binary = '';
     $values = str_split($encrypted,3);
     foreach($values as $chr){
        $chr = ltrim($chr,'0');
        $binary .= chr($chr);
     }
     return mdecrypt_generic($this->getCipher(),$binary);
  }
}

$crypt = new Crypter('secret key','12348765');
$encrypted = $crypt->encrypt(1234);
echo $encrypted.PHP_EOL;
//fake missing leading 0
$encrypted = ltrim($encrypted,'0');
echo $encrypted.PHP_EOL;
$decrypted = $crypt->decrypt($encrypted);
echo $decrypted.PHP_EOL;

结果:

057044206104214236155088
57044206104214236155088
1234