2014-06-07 2 views
0

PHP 코드에 PKCS7 패딩을 적용하려고합니다. 나는 블록 크기는 16 바이트가 될 것으로 예상된다PHP PKCS7 패딩 버그

https://gist.github.com/Halama/5956871

이 요지를 내 코드를 산출했다. 데이터는 "password"이며 길이는 8 바이트입니다. 패드를 가져온 후에는 암호화 할 데이터 끝에 패드를 추가합니다.

$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, $thisMCRYPT_MODE_CBCmode); 
$pad = $blockSize - (strlen($data) % $blockSize); 
$data = $data . str_repeat(chr($pad), $pad); 

문제는 데이터가 실패 할 곳을 해독하는 것을 인스턴스 (많은)가있다.

아래에 base64로 인코딩 된 샘플 데이터가 제공됩니다. 상기 디코딩 된 샘플들의 처음 16 바이트는 IV를 나타내는

작업 : cjg1RYWxlc8bDH2de43t0bv1ug36i8ayjWDQTela938 = (패드 길이 : 8)이 작동하지

: 9wWI + MyYj5ZVj2sC4xr7EgOsgNSoeTZW1yM8ddmqg18 = (패드 길이 122)

이 패드 길이는 다음을 사용하여 검색됩니다.

$pad = ord($data[strlen($data) - 1]); 

mcrypt_enrypt를 사용하여 "password"문자열을 암호화하고 있습니다. 내가 Mcrypt 라이브러리를 위해 사용하고 열쇠는

lGbsVE + qVO1P2ue0iCjrTPMU5hKX9aHE7r1aUUeqFag =

답변

0

이 해결되었습니다. http를 통해 전송 될 때 base64로 인코딩 된 데이터의 "+"기호가 공백으로 변환되어 다른 값을 갖게됩니다.

내가 한 것은 클라이언트가 base64로 이진 데이터를 인코딩하고 urlencode() 함수를 통해 전달한 것입니다. PHP 쪽에서 rawurldecode을 사용하여 데이터를 처리하므로 "+"기호가 무시됩니다.

0

패딩은/안 패딩 루틴이 제대로 표시입니다. 이것이 제공하지 않는 것은 블록 크기보다 높은 패딩 값에 대한 보호 장치입니다.

잘못된 키를 사용하여 암호문을 해독하거나 암호문이 손상된 경우 (그리고 IV가 올바르지 않더라도 짧은 크기의 암호문의 경우) 결과는 임의의 데이터가있는 (채워진) 일반 텍스트가됩니다. 따라서 마지막 바이트는 잘못된 결과를 unpadding하는 동안 임의의 값을 가질 수 있습니다.

이러한 실패로부터 보호하려면 암호문에 대해 MAC 값을 사용하고 다른 키를 사용하는 것이 좋습니다. 당장은이 문제가 패딩 루틴이 될 가능성이 없습니다.

+0

실패? 당신은 "잘못된 키를 사용하여 .. 암호 텍스트가 손상되었습니다"라는 오류를 언급하고 있습니까? 또는 "블록 크기보다 높은 패딩 값"오류를 언급하고 있습니까? 질문에서 언급 한 열쇠가 맞습니다. 두 샘플을 모두 암호화하는 데 사용한 것과 동일한 키입니다. – kapitanluffy

+0

사용중인 패딩/패딩 구성표가 다소 평범한 것 같습니다. 필자가 잘못 생각하지 않는다면, 마지막 바이트가 122 인 경우에만 잘못된 결과를 얻을 수 있습니다. 확인하기가 쉬워야합니다.* 평문에 '00'값이있는 문자가 포함 된 경우 어떻게 될지 100 % 확신하지 못합니다. * –

+0

"이 잘못된 결과 만 가능"할 수 있다는 것은 무엇을 의미합니까? – kapitanluffy