0

간단한 암호화 클래스를 만들려고하지만 결과 문자열에 비 ASCII 문자가 채워집니다. rtrim(), utf8로 변환, 다른 답변에서 언급 한 등 시도했다. 내가 뭘 놓치고 있니? 다음은 메모장에 결과를 붙여 넣을 때 문자가 ++ 문자 here를 포함PHP 암호화/암호 해독 패딩 된 문자 추가

enter image description 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을위한 2 차 arg로 전달할 필요가 있습니다. 인수가 전달되지 않으면 rtrim은 다른 '이상한'문자가 아닌 공백 문자를 원격으로 시도합니다. – GarouDan

+0

Notepad ++ 변환기에 따라 이진수 '110'의 문자로 나타납니다. 변환기를 사용하여 ASCII로 긴 하이픈으로 나타납니다. – giraffee

+0

'rtrim (base64_encode ($ crypt), "\ x110")'을 시도하고 무슨 일이 일어 났는지 리턴하십시오. '나쁨'결과물도 붙여 넣으십시오. – 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