加密/解密会导致字符串开头的替换和不正确的字符

时间:2015-01-22 17:00:53

标签: php encryption

以下是我的加密和解密函数

public function encrypt($text){
        $key = hash("md5", KEY);
        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TWOFISH, MCRYPT_MODE_CBC), MCRYPT_RAND);
        $result = base64_encode(mcrypt_encrypt(MCRYPT_TWOFISH, $key, $text, MCRYPT_MODE_CBC, $iv));
        return $result;
}

public function decrypt($text){
        $key = hash("md5", KEY);
        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TWOFISH, MCRYPT_MODE_CBC), MCRYPT_RAND);
        $result = trim(mcrypt_decrypt(MCRYPT_TWOFISH, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));    
        return $result;
}

当对JSON字符串运行加密以存储为文本文件然后检索和解密时,结果字符串的前面部分包含替换和/或不正确的字符:

预期:

  

{ “玩家”:[{ “标记”:” ...

实际

  !

Ӹg ^ @ $ {WR BEL “:” ......

如果它有任何区别,每次刷新同一文件上的页面时,实际放置/不正确的字符都不同。

1 个答案:

答案 0 :(得分:0)

如果有人碰到这个......

在编码之前需要将IV添加到文件中,如下所示:

public function encrypt($text){
    $key = hash("md5", KEY);
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TWOFISH, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM);
    $result = base64_encode($iv.mcrypt_encrypt(MCRYPT_TWOFISH, $key, $text, MCRYPT_MODE_CBC, $iv));
    return $result;
}

然后在解密时从解码后的字符串中取出IV并使用它进行解密,如下所示:

public function decrypt($text){
    $key = hash("md5", KEY);
    $decode = base64_decode($text);
    $iv = substr($decode, 0, 16);
    $decrypt = substr($decode, 16);
    $result = mcrypt_decrypt(MCRYPT_TWOFISH, $key, $decrypt, MCRYPT_MODE_CBC, $iv);
    return $result;
}