2014-12-08 6 views
0

나는 온라인으로 다음과 같은 해독 기능을 발견했다. 내가 찾은 다른 해독 기능이 기능의 varation 있습니다제거 패딩 기능

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); 
} 

내 질문은 다음 경우 : ORD() 함수는 문자의 ASCII 값을 제공합니다. 그런 다음이 ASCII 값은 문자열 길이와 관련된 계산에 사용됩니다. 왜 그런 경우입니까? (패딩이 이루어진 ASCII 값이 문자열 길이와 함께 사용되어서는 안됩니다.)

+0

실제로 작동합니까? 또한 암호화 된 부분은 어디에 있습니까? –

+0

예,이 기능은 작동합니다. 일부 모의 데이터로 테스트 한 결과 반환 값은 항상 예상대로입니다. – Tom

+2

'ord'에 대한 문서는 완전히 잘못된 것은 아니지만 다소 오도 된 것입니다. 바이트의 부호없는 정수 값을 반환합니다. 어느 ASCII 상관 관계. # – Flosculus

답변

1

블록 암호 용 CBC 및 ECB와 같은 일부 작동 모드에는 암호가 정의되어 있기 때문에 패딩이 필요합니다. 완전한 블록. 그래서 패딩은 다음 블록 경계까지 평문을 채우기 위해 사용됩니다. 또한, 각 바이트는 패딩의 길이에 대응 ord()이 "문자"에 대한 정수를 반환 동시에 패딩의 길이를 인코딩하기 위해 사용된다. 이렇게 두 번 사용하면 암호문 크기가 한 블록 씩 줄어 듭니다 (여기서 패딩이나 일반 텍스트의 크기는 유지됩니다).

표시 된 패딩 방식은 PKCS#5/PKCS#7에 해당합니다.