2014-06-19 1 views
0

문자열로 PHP에서 SHA 256을 구현하고 있습니다. 알고리즘에서 어디에서 자릅니다?SHA 256 해시 알고리즘의 비트는 어디에서 자릅니다?

이진 추가가 발생하는 곳이 너무 많습니다. W (i) 내의 비트들의 수는 계속 증가하며, 압축 함수와 동일하다. 그렇다면 값을 자르는 위치는 어디입니까? 내 배열을 위해서 var_dump 때

나는이 얻을 :

 
array(64) { [0]=> string(32) "01100001001000000111010001100101" [1]=> string(32) "01110011011101001000000000000000" [2]=> string(32) "00000000000000000000000000000000" [3]=> string(32) "00000000000000000000000000000000" [4]=> string(32) "00000000000000000000000000000000" [5]=> string(32) "00000000000000000000000000000000" [6]=> string(32) "00000000000000000000000000000000" [7]=> string(32) "00000000000000000000000000000000" [8]=> string(32) "00000000000000000000000000000000" [9]=> string(32) "00000000000000000000000000000000" [10]=> string(32) "00000000000000000000000000000000" [11]=> string(32) "00000000000000000000000000000000" [12]=> string(32) "00000000000000000000000000000000" [13]=> string(32) "00000000000000000000000000000000" [14]=> string(32) "00000000000000000000000000000000" [15]=> string(32) "00000000000000000000000000110000" [16]=> string(32) "10001111101010001101101001000010" [17]=> string(32) "01110011100100101000000000000000" [18]=> string(32) "01110110010010101111110000010111" [19]=> string(32) "00010000000111001101001100011011" [20]=> string(32) "00100001100101001100011101010011" [21]=> string(32) "11110011111010101110110100111001" [22]=> string(32) "11111011010010111001000111111001" [23]=> string(32) "10111010101100000001011101110101" [24]=> string(33) "100101110100011111001000000101000" [25]=> string(32) "01111111110001011100001000100010" [26]=> string(33) "010000100100001011110010010001101" [27]=> string(32) "01111010110111110100100010111101" [28]=> string(33) "110010001011110100010000011100100" [29]=> string(33) "101001000101000110011011111011111" [30]=> string(33) "111000011011101011011101110010101" [31]=> string(34) "1111001011100001001101111011110110" [32]=> string(34) "1010010011000001000100101100000010" [33]=> string(35) "10101101001100111001111100111111010" [34]=> string(34) "1110100101001100001000011110000110" [35]=> string(36) "100101010100100001101110101111000011" [36]=> string(34) "1110001101001101001101110111011000" [37]=> string(36) "110101001100000100001110011000000101" [38]=> string(36) "100110010110100011010111011101100110" [39]=> string(36) "101110011100110000110001010010110000" [40]=> string(36) "100000101011010110001001000100011101" [41]=> string(37) "1001110001010110110001110110101011101" [42]=> string(37) "1000000101001011010111010000001100100" [43]=> string(37) "1001000011101111000001111110010100100" [44]=> string(38) "10010000101101110001100100010100010101" [45]=> string(37) "1011111001101101011111001000110010000" [46]=> string(39) "100101011110011011000000001001110010001" [47]=> string(37) "1001101011101110111000000100111010000" [48]=> string(39) "010001011100001101101000011010011100010" [49]=> string(38) "10011100010110000011111110010101101000" [50]=> string(39) "110011100111000010101100100101110011001" [51]=> string(38) "11001101111101010001000010110001100100" [52]=> string(40) "1001010000101100000100110100110000100011" [53]=> string(40) "1000010101011111001110000100101100111000" [54]=> string(40) "1111011111011011100000000001110000011101" [55]=> string(40) "0101110001001001110010001011110111010010" [56]=> string(40) "0100111101101110101111101011110000000011" [57]=> string(40) "1100101000101110000000101100000111111110" [58]=> string(40) "1101100110111011011010010001101100000100" [59]=> string(41) "10000100101011000111001100110101010010001" [60]=> string(41) "10111001010111100010000110001111101100110" [61]=> string(42) "110001101011011010100110111110101100101111" [62]=> string(42) "101001011000100100011001011101100100101111" [63]=> string(42) "101110011001100001001100001010110101001111" } 

내가 배열 배열 또는 후에 밀어 전에 이루어집니다 값을 잘라야합니까? 이전에 자르면 해당 반복이 잘린 값을 차지하며 값이 변경됩니다.

또한 여기

$tmp=$q4; 
$tr1=substr($tmp,-32); 

$tmp2=binary_add($s0,$maj); 
$tr2=substr($tmp2,-32); 

$H=$G; 
$G=$F; 
$F=$E; 
$E=binary_add($tr1,$D); 
$D=$C; 
$C=$B; 
$B=$A; 
$A=binary_add($tr1,$tr2); 

I는 임시 변수를 추가하는 (그리고 H의 VAR A를 업데이트하는) 절단되어있는 것을 알 너무이 맞습니까?

+4

'hash ("sha256", $ data)'대신 SHA-256을 직접 구현하는 이유가 있습니까? –

+0

와우, 문자열을 비트 배열로 사용하여 SHA-256 구현? 그게 ... 특별하다. – user3553031

+0

그래, 기본적으로 그게 내 프로젝트 야. P 일 좀해야 해. 그렇지 않으면 내 멘토가 내 급여에서 나를 뽑아. D – abhinizer

답변

1

먼저 SHA-256을 직접 구현하면 안됩니다. 버그가 있고 느린 무언가로 끝나기 쉽습니다. 플랫폼의 라이브러리에서 구현을 사용해야합니다. 암호 규칙을 염두에 두십시오 :

  1. 고유 한 암호를 직접 디자인하지 마십시오.
  2. 자신 만의 암호를 절대로 구현하지 마십시오.
  3. 누구나 스스로 암호화 할 수없는 암호화를 설계 할 수 있습니다.

SHA-256은 256 비트 출력을 생성합니다. 덤프가 256 비트보다 상당히 많은 알고리즘의 내부 상태를 포함하고있는 것 같습니다. 이것이 SHA-256 기능의 끝 부분에 있다면, 단계가 빠져 있습니다. 최종 출력을 얻으려면 아무것도자를 필요가 없습니다.

+0

안녕하세요 .. 입력을 주셔서 감사합니다. 표준 내장을 사용하는 것을 이해합니다. 내가 뿌리 째 내뱉는 것이지만 그렇게되면 내 프로젝트입니다. 내 멘토가 나를 구현하도록 요청했습니다 .. 그래서 아무 옵션이 .. 코드에오고 내 최종 해시 값으로 비트의 오른쪽 숫자를 받고 있지만 그 잘못 .. 만약 당신이 32 비트 문자열 및 u 바이너리가 아니. 비트 r의 가능성이 33 증가 할 수 있습니다 .. 배열은 새로운 것들을 genaterating에 대한 이전 값을 취하고 있기 때문에 나는 긴 문자열을 받고 있는데 .. 어떤 도움이 uud이 놀라운 점에서 줄 수있는 .. 우르 시간 주셔서 감사합니다 Logged – abhinizer

관련 문제