Php mcrypt函数在旧服务器上工作,而不是在新服务器上工作

Php mcrypt函数在旧服务器上工作,而不是在新服务器上工作,php,encryption,Php,Encryption,我们需要使用mcrypt解码函数 旧服务器Ubuntu Linux 10.04.1。有一个info.php可用 新服务器DebianLinux8。有一个info.php可用 两台服务器上的PHP版本5.6.14-0+deb8u1 PHP代码: <?php $salt = '5@Fuv}7F^LkC[k_bx~E^'; // $text = 'Our text decoeded'; $encout = simple_encrypt($salt, $text); ech

我们需要使用mcrypt解码函数

  • 旧服务器Ubuntu Linux 10.04.1。有一个info.php可用
  • 新服务器DebianLinux8。有一个info.php可用
两台服务器上的PHP版本5.6.14-0+deb8u1

PHP代码:

<?php

  $salt = '5@Fuv}7F^LkC[k_bx~E^'; // 
  $text = 'Our text decoeded';
  $encout = simple_encrypt($salt, $text);
  echo 'encrypted: ' . $encout .'<br/>';
  echo 'decrypted: ' . simple_decrypt($salt, $encout) ;


  function simple_encrypt($salt, $text) {   
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
  }

  function simple_decrypt($salt, $text)
  {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt,       base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
  }
?>


为什么这两种服务会有所不同?

这是因为之前,mcrypt会接受非标准的按键或iv大小,并简单地用\0填充它们,直到它们达到正确的长度。从5.6开始(您的旧服务器没有运行5.6,似乎正在运行5.3),正如您在文档中看到的,无效密钥和ivs不再被接受,mcrypt_加密失败。您的密钥似乎有160位长,需要192位(下一个有效密钥长度)。您可以通过在密钥上附加4\0来修复它

我认为它使用四个0x00字节来达到一个有效的密钥大小:192位。对于256位键控密码(如MCRYPT_RIJNDAEL_256),192位不是有效的密钥大小。MCRYPT_RIJNDAEL_256中的256表示块大小。Rijndael独立支持三种块大小和三种键大小。也许你把Rijndael和AES搞混了。AES是Rijndael的一个子集,固定块大小为128位。不,我没有把它们弄混,只是弄错了。将密钥大小放在那里在其他地方都是非常典型的(比如,TLS批量密码套件描述符)。我猜他们之所以把块大小放在那里,是因为之前的接口存在糟糕的、无声的空填充。我会在一点时间内解决这个问题。而且,这个加密代码非常不安全,等