0

我正在嘗試創建一個簡單的加密類,但生成的字符串正在填充非ascii字符。我試過rtrim(),轉換爲utf8等,如其他答案中所述。我錯過了什麼?以下是文字顯示粘貼的結果到記事本++時PHP加密/解密添加填充字符

enter image description here

引擎收錄包含字符here。在html中顯示爲't',但將其複製到記事本中後顯示隨機數據位。

class Crypter implements ICrypter { 

private $Key; 
private $Algo; 

public function __construct($Algo = MCRYPT_BLOWFISH) { 

    $this->Key = substr('key', 0, mcrypt_get_key_size($Algo, MCRYPT_MODE_ECB)); 
    $this->Algo = $Algo; 

} 

public function Encrypt($data) { 

    //$iv_size = mcrypt_get_iv_size($this->Algo, MCRYPT_MODE_ECB); 
    //$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

    $blocksize = mcrypt_get_block_size('blowfish', 'ecb'); // get block size 
    $pkcs = $blocksize - (strlen($data) % $blocksize); // get pkcs5 pad length 
    $data.= str_repeat(chr($pkcs), $pkcs); // append pkcs5 padding to the data 


    $crypt = mcrypt_encrypt($this->Algo, $this->Key, $data, MCRYPT_MODE_ECB); 
    return rtrim(base64_encode($crypt)); 

} 

public function Decrypt($data) { 

    $crypt = base64_decode($data); 
    $iv_size = mcrypt_get_iv_size($this->Algo, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $decrypt = mcrypt_decrypt($this->Algo, $this->Key, $crypt, MCRYPT_MODE_ECB, $iv); 
    return rtrim($decrypt); 
} 
} 
+0

我想你應該把你得到的錯誤結果。但是,如果你知道什麼地方的'壞'字符,你可能需要嘗試通過它作爲rtrim的輔助參數。如果沒有任何參數被傳遞,rtrim會嘗試遠程空白,而不是其他「奇怪」字符。 – GarouDan

+0

根據Notepad ++轉換器看起來是二進制'110'的一個字符。使用轉換器在ASCII中顯示爲一個長連字符。 – giraffee

+0

嘗試'rtrim(base64_encode($ crypt),「\ x110」)'並返回發生的事情。請發佈一個包含'bad'輸出的pastebin。 – GarouDan

回答

5

您需要在解密時處理與加密相同的填充。這裏是你的代碼的工作示例:

<?php 
class Crypter{ 

    private $Key; 
    private $Algo; 

    public function __construct($Algo = MCRYPT_BLOWFISH) { 

     $this->Key = substr('key', 0, mcrypt_get_key_size($Algo, MCRYPT_MODE_ECB)); 
     $this->Algo = $Algo; 

    } 

    public function Encrypt($data) { 

     //$iv_size = mcrypt_get_iv_size($this->Algo, MCRYPT_MODE_ECB); 
     //$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

     $blocksize = mcrypt_get_block_size('blowfish', 'ecb'); // get block size 
     $pkcs = $blocksize - (strlen($data) % $blocksize); // get pkcs5 pad length 
     $data.= str_repeat(chr($pkcs), $pkcs); // append pkcs5 padding to the data 


     $crypt = mcrypt_encrypt($this->Algo, $this->Key, $data, MCRYPT_MODE_ECB); 

     return rtrim(base64_encode($crypt)); 

    } 

    public function Decrypt($data) { 

     $crypt = base64_decode($data); 
     $iv_size = mcrypt_get_iv_size($this->Algo, MCRYPT_MODE_ECB); 
     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
     $decrypt = mcrypt_decrypt($this->Algo, $this->Key, $crypt, MCRYPT_MODE_ECB, $iv); 

     $block = mcrypt_get_block_size('blowfish', 'ecb'); 
     $pad = ord($decrypt[($len = strlen($decrypt)) - 1]); 
     return substr($decrypt, 0, strlen($decrypt) - $pad); 
    } 
} 

$crypter = new Crypter(); 
$data = "Some data to encrypt"; 
$encryptedData = $crypter->Encrypt($data); 
$decryptedData = $crypter->Decrypt($encryptedData); 
echo "Decrypted Data = [$decryptedData]\n"; 

注意三條線我換成你原來Decrypt()回報符合。

+0

與我所做的幾乎完全相同,完全忘記了未加註。謝謝! – giraffee