并没有使用随机模式、在本地所有机器上(WinXP)测试都是正常的
但是在下面的环境(Centos)中key跟data每次加密都不一致
根本无法解密出来
请问是mcrypt哪个选项设置的问题?环境配置Centos5.2 + Apache/2.2.11 + (Unix) PHP/5.2.9  + mcrypt/2.5.8程序代码<?php
function encrypt($data, $key) {
    //MCRYPT_RAND|MCRYPT_DEV_URANDOM|MCRYPT_DEV_RANDOM
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_DEV_RANDOM);
    $data = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
    return bin2hex($data);
}
function decrypt($data, $key) {
    if(''==$data)return '';
    $iv   = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_DEV_RANDOM);
    $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, hex2bin( $data ), MCRYPT_MODE_CBC, $iv);
    return str_replace(chr(0), '', $data);
}
function hex2bin($data) {
    if(''==$data)return '';
    for($i=0, $len = strlen($data);$i<$len;$i+=2)
        $return .= pack("C",hexdec(substr($data,$i,2)));
    return $return;
}$key = 'key';
$data = '$#$$$$$$$$$$$$$$$$$$';echo( 'key:' . $key. '<br>' );
echo( 'data:' . $data . '<br>' );$temp = encrypt($data, $key);
echo( 'encrypt:' . $temp . '<br>' );$temp = decrypt($temp, $key);
echo( 'decrypt:' . $temp . '<br>' );
?>

解决方案 »

  1.   

    不管是用MCRYPT_RAND、MCRYPT_DEV_URANDOM还是MCRYPT_DEV_RANDOM
    结果都是随机的
    mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_DEV_URANDOM);
      

  2.   

    问题解决
    用MCRYPT_MODE_CBC获取种子   用MCRYPT_MODE_ECB加解密就没有问题了
        $iv   = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
        $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, hex2bin( $data ), MCRYPT_MODE_ECB, $iv);
      

  3.   

    function encrypt($data, $key) {
        //MCRYPT_RAND|MCRYPT_DEV_URANDOM|MCRYPT_DEV_RANDOM
        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);
        $data = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_ECB, $iv);
        return bin2hex($data);
    }
    function decrypt($data, $key) {
        if(''==$data)return '';
        $iv   = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);
        $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, hex2bin( $data ), MCRYPT_MODE_ECB, $iv);
        return str_replace(chr(0), '', $data);
    }