4

我正在尝试使用 CBC 模式下的 Rijndael 密码和 256 位密钥加密 PHP 中的一些数据,但由于某种原因,我收到以下错误消息:

mcrypt_encrypt() 模块初始化失败

我的代码:

    $hashKey = hash('sha256',$key);
    $iv = hash('sha256',$hashKey);

    //                                                 ------Cipher-------------key-------------Data-------------Mode---------IV--
    $encryptedQuestion = base64_encode(mcrypt_encrypt('MCRYPT_RIJNDAEL_256', $hashKey , $_POST['question'], MCRYPT_MODE_CBC, $iv));

谁能看出这有什么问题?

4

3 回答 3

5

我可以发现代码存在一些问题:

  1. $iv不应该依赖于$hashKey;相反,您应该使用mcrypt_create_iv().

  2. $hashKey应该是二进制的而不是文本的。

  3. MCRYPT_RIJNDAEL_256是一个常量,它不应该作为字符串传递。

以下代码比您的代码更冗长,但它应该让您深入了解加密某些内容所需的步骤:

$crypto = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($crypto), MCRYPT_DEV_URANDOM);

$hkey = hash('sha256', $key, true);

mcrypt_generic_init($handle, $hkey, $iv);

$enc_question = mcrypt_generic($handle, $_POST['question']);

mcrypt_generic_deinit($handle);
mcrypt_module_close($handle);

我也遗漏了任何错误检查。

于 2012-09-04T15:36:18.033 回答
0

我遇到了类似的错误。我将常量分配给一个变量并传递了该变量,这就是错误的原因。

这对我来说失败了 > return new encKey($cipher_name, $mode, $value);

现在这个工程 > return new encKey(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB, $value);

于 2014-11-11T12:38:58.960 回答
0

在 php 5.6 中尝试 mcrypt_ecb 来克服无效密钥问题

    $choice ="2";
      $key = "1234";
$key = hash("sha512", $key, TRUE);

    for ($x = 0; $x < 8; $x++) {
        $key = $key . substr($key, $x, 1);
    }
    $msg = "pato";
    echo("key is".$key." \n");

    if ($msg == ''){
        die("Please enter a text to encrypt! ");
        }
    if ($key == ''){
        die("Please enter a key! ");
        }        


   function pkcs5_pad($text, $blocksize) {

    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
    }
 function pkcs_pad($text, $blocksize) {

    //$pad = $blocksize - (strlen($text) % $blocksize);
        $tes=substr($text,0,$blocksize) ;
    return $tes;
    }
    function encryptnow( $thekey, $themsg)
    {



$padded = pkcs5_pad($themsg, mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
           echo("padded".$padded."\n");
  $keypad = pkcs_pad($thekey, mcrypt_get_key_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
   $i;
  //$iv=pkcs5_pad($i, mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
   //$iv = mcrypt_create_iv(8, MCRYPT_DEV_RANDOM);
         //  echo("padded".$keypad."\n");
    $encrypted = base64_encode(mcrypt_ecb(MCRYPT_3DES, $keypad, $padded, MCRYPT_MODE_CBC));


 echo "<html><hr size='2' ></html>";
        echo "<P><P><b>Plain Text : </b>";
        echo($themsg);
        echo "<p><b>Cipher Text : </b> ";
        echo "$encrypted";

        die();
    }


   if ($choice == '2'){



        encryptnow($key, $msg);
   }
于 2015-01-26T07:17:14.497 回答