PHP:创建一个iv。不工作

时间:2015-01-30 16:56:00

标签: php encryption mcrypt

我已经编写了一个用mcrypt加密数据的代码。当我创建一个IV它工作但是当我解密它时,解密的文本与以前不一样,它给了我这个错误:

Warning: mcrypt_decrypt(): The IV parameter must be as long as the blocksize

这是我创建IV时的代码:

$iv = mcrypt_create_iv(mcrypt_get_iv_size($algo, $type), MCRYPT_RAND);

问题还在于它为字符串提供了不可读的字符。

以下是加密时的代码:

trim(base64_encode(mcrypt_encrypt($algo, $pass,
                                  $data, $type, $iv)));

这是解密:

trim(mcrypt_decrypt($algo, $pass,
                    base64_decode($data), $type, $iv));

问题:为什么它不能解密所以我得到了明文以及它为什么会给我一个错误。

修改 当我使用EMPTY IV时,它可以工作,我得到明文,但它仍然给我错误:

Warning: mcrypt_xxxxxx(): The IV parameter must be as long as the blocksize 

1 个答案:

答案 0 :(得分:0)

  

我已经编写了一个代码,用于使用mcrypt 加密数据。

这永远不是好兆头。 (强调我。)

  

创建IV时,对它解密时可以使用,但解密后的文本与以前不同,这会给我这个错误:

<svg>
<!-- A bunch of paths and groups-->
  <defs>
          <mask id="joined-mask" maskUnits="objectBoundingBox">
            <linearGradient id="tran-grad">
	            <stop  offset="0" stop-color="#fffff" stop-opacity="0"/>
	            <stop  offset="0.3359" stop-color="#fffff"/>
	            <stop  offset="0.7499" stop-color="#fffff"/>
	            <stop  offset="1" stop-color="#fffff" stop-opacity="0"/>
            </linearGradient>
            <rect fill="url(#tran-grad)" width="1245" height="300"/> 
          </mask>
        </defs>
      </svg>
     

这是创建IV时的代码:

Warning: mcrypt_decrypt(): The IV parameter must be as long as the blocksize

您知道$iv = mcrypt_create_iv(mcrypt_get_iv_size($algo, $type), MCRYPT_RAND); 是什么意思吗?这意味着MCRYPT_RAND,一个不安全的随机数生成器。

每种需要初始化向量(IV)的算法都具有以下安全要求:

  1. 初始化向量不得重复。
  2. 初始化向量必须不可预测

rand()都失败了:MCRYPT_RAND仅有2 ^ 32个可能的输出,并且可以预测。

  

问题:为什么它不能解密,所以我得到明文,为什么它给我一个错误。

最简单的答案是mcrypt sucks and you should use something else。我的建议是here