0
我正在嘗試創建一個簡單的加密類,但生成的字符串正在填充非ascii字符。我試過rtrim(),轉換爲utf8等,如其他答案中所述。我錯過了什麼?以下是文字顯示粘貼的結果到記事本++時PHP加密/解密添加填充字符
引擎收錄包含字符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);
}
}
我想你應該把你得到的錯誤結果。但是,如果你知道什麼地方的'壞'字符,你可能需要嘗試通過它作爲rtrim的輔助參數。如果沒有任何參數被傳遞,rtrim會嘗試遠程空白,而不是其他「奇怪」字符。 – GarouDan
根據Notepad ++轉換器看起來是二進制'110'的一個字符。使用轉換器在ASCII中顯示爲一個長連字符。 – giraffee
嘗試'rtrim(base64_encode($ crypt),「\ x110」)'並返回發生的事情。請發佈一個包含'bad'輸出的pastebin。 – GarouDan