2016-10-18 6 views
1

연습으로 저는 PHP로 MD5를 구현하려고합니다. 필자는 PHP가 내장 함수를 가지고 있지만 작동하는 소스를 읽고, 실행하고 연구하고 싶습니다. 적절한 섹션의 주석 처리가 해제되어 있고 (메시지 패딩을 사용 가능하게하기 위해) 적절하게 배열 된 배열이 적절하게 (PHP의 버전과의 호환성을 위해) 포맷 된 경우에 효과가있는 this script을 발견했습니다. 그러나 정확한 길이에도 불구하고 생성 된 해시는 MD5가 아닙니다. 예를 들어, 제로 길이 문자열에 대한 MD5 해시가 있어야한다 :PHP의 MD5 스크립트

d41d8cd98f00b204e9800998ecf8427e

하지만 같은위한 스크립트에 의해 반환되는 해시 것은 : 내가 다른 문자열을 시도했습니다

85bd946a585af9fd3fb9eda68707c1d8

상관 관계는 없습니다. 나는 MD5를 공부 했으므로 그것이 어떻게 작동하는지에 대해 합리적인 지식을 가지고 있습니다. 나는 대본을 조사하고 있었지만 합법적 인 것처럼 보인다. 나는 왜이 스크립트가 MD5를 반환하지 않는지 발견하는 도전에 대해 다른 사람에게 큰 소리로 외칩니다.

+0

'내 버전? – JOUM

+1

나는 그것을 달렸다. 그리고 그것은 많은'undefined index'es를 뱉어 냈다. 그래서 나는 바로 그곳을 포기했다. – AbraCadaver

+0

안녕하세요, 불행히도 이전 버전을 실행하고 있습니다 - 5.3.28 그러나 MD5 해시를 반환해야합니다. 이 스크립트가 7에서 진정한 MD5 해시를 반환하는지 알려주지 않겠습니까? – James

답변

2

회전 기능에 문제가 있기 때문에이 스크립트는 정품 MD5 해시를 반환하지 않았습니다.

현재 PHP는 기본 비트 회전 기능을 제공하지 않습니다. 그럼에도 불구하고 비트 시프트는 왼쪽 시프트 결과와 오른쪽 시프트 결과를 결합하여 이루어질 수 있습니다. 그러나 음의 부호가있는 정수의 오른쪽 비트 시프트 동안 부호 비트는 피연산자의 부호 보존을 위해 시프트됩니다. 이것은 원하지 않는 결과를 가져오고 비트 마스크를 사용하여 극복됩니다.

여기서, $x은 입력 값이고 $c은 이동할 비트 수입니다. 모든 값은 32 비트입니다.

원본 코드 :

`return ($x << $c) | ($x >> (32 - $c));` 

새로운 코드 : 나는 의도적으로 라인 4에 여러 공간을 떠 났어요

if($x < 0){ 
    return ($x << $c) | abs(((pow(2, $c)) * -1) - ($x >> (32 - $c))); 
} else { 
    return ($x << $c) |       ($x >> (32 - $c)) ; 
} 

은 (공식 유사성 및 현재 상태를 표시하는 라인 2와 대조 또는 부재)를 결정할 수있다.

삼항 포맷 : PHP` PHP7의

return ($x < 0) ? (($x << $c) | abs(((pow(2, $c)) * -1) - 
     ($x >> (32 - $c)))) : (($x << $c) | ($x >> (32 - $c)));