2013-01-07 47 views
0

首先,请原谅的问题,它可能是一个简单的问题,但我有麻烦了解的加密方法..mcrypt_encrypt乱码

我使用下列功能加密/解密:

private function encodemc($value,$skey){ 
    if(!$value){return false;} 
    $skey = substr($skey, 2, 4); 
    $text = $value; 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $skey, $text, MCRYPT_MODE_ECB, $iv); 
    return trim($this->safe_encode($crypttext)); // safe_encode adds another encoding using `base64_encode` 
} 

private function decodemc($value,$skey){ 
    if(!$value){return false;} 
    $skey = substr($skey, 2, 4); 
    $crypttext = $this->safe_decode($value); 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $skey, $crypttext, MCRYPT_MODE_ECB, $iv); 
    return trim($decrypttext); 
} 

$key看起来像这样:570c45546dwq45gjk191

我将要加密的值传递给第一个函数,然后将其保存到数据库,然后从数据库中检索它,然后解密并将其显示为html文本。

问题是某些文本没有得到解密/加密的权利,并且它显示在html页面中,就好像它是错误的文本编码。

怪异的部分是10个项目中,只有2或3个是乱码,取决于密钥。 另外,有时候只有一部分字符串会出现乱码。

我发现是什么原因造成的嘟are是一些随机字母。例如,当使用上述密钥时,字母S会破坏代码并且文本会变成乱码。

因此,我已将substr($skey, 2, 4);应用于密钥以查看是否有任何更改。原来,如果我改变密钥,破坏代码的字符是不同的。

但即使使用长度为1的键,问题仍然存在。

有什么想法是什么问题?

编辑:

下面的代码的其余部分。

private function safe_encode($string) { 
    $data = base64_encode($string); 
    $data = str_replace(array('+','/','='),array('-','_',''),$data); 
    return $data; 
} 

private function safe_decode($string) { 
    $data = str_replace(array('-','_'),array('+','/'),$string); 
    $mod4 = strlen($data) % 4; 
    if ($mod4) { 
     $data .= substr('====', $mod4); 
    } 
    return stripslashes(base64_decode($data)); 
} 
+1

我们还需要'safe_encode'和'safe_decode'函数的代码。我打赌,这不是他们就是打破事情的'修剪'。 – Charles

+0

如果这两个safe_en/decode函数只会执行base64编译/解码操作,那么您将不会为它创建函数,对吗? – hakre

+1

'stripslashes'!如果你发现自己需要它,就会出现问题。 – Charles

回答

0

这似乎是一个非常奇怪的问题。

我没有给你明确的答案,但这里有几件事你可以尝试。

  1. 加密/解密不去数据库。如果问题消失,那么通过加密函数处理字符输出的数据库存在问题。
  2. 在加密之前修改该值。如果问题消失,则在加密后修剪是错误的。
  3. 删除safe_encodesafe_decode的代码。如果问题消失,那么这些功能会添加/删除重要的事情。

重要的是,您一次完成以上所有操作,因为可能存在多个问题。如果上述步骤消除了这些问题,则一次重新引入一个问题,以确定哪些问题会导致问题。

+0

OP指出这些函数只是base64编码。如果是这样,你列出的要点是没有意义的,也许不是3,但这听起来更像是评论,而不是答案。是的,问题不完整,所以不完全是你的“错误”。 – hakre

+0

我尝试过跳过'safe_decode/encode'功能,但他们的文字更加乱码...... – ghego1