sha 256을 짜려는데요 이해가 되지 않는 부분이 있어 문의 드립니다
처음에 일단 메세지를 block(512bit)으로 만들기 위해 448bit로 패딩하거나 파싱하는거 같은데
l을 word 단위로 생각해야하는건지 단어 중간에 bit를 쪼갤 수 있다고 생각해야하는건지 모르겠습니다
예를 들어서 512bit가 들어올 경우
case1.
l은 8의 배수라고 가정(byte -> bit)
k의 최소값은 7, l의 최대값은 440bit(55글자)
마지막 64bit 부분은 440(0x1b8)
M0 = 440bit data + 1bit(1) + 7bit(0) + 64bit(440)
M1 = 72bit data + 1bit(1) + 375bit(0) + 64bit(72)
case2.
k의 최소값은 0, l = 447bit
M0 = 447bit data + 1bit(1) + 0bit + 64bit(447)
M1 = 65bit data + 1bit(1) + 382bit(0) + 64bit(65)
뭐가 맞을까요?
SHA256 라이브러리 사용이 아닌 직접 구현하는 것이라면 가장 빠른 방법은 기존에 구현되어 있는 SHA256 라이브러리 소스를 직접 분석해보는게 빠르지 않나 ?
보나마나 딱 '1byte'나 bit로 자르는거지. 애초에 padding하는 이유가 뭐겠냐? 해싱하는데 규격맞추려고 하는거고, hash란건 어차피 원래값 유지따위는 전혀 관심없는거야. 그래서 2바이트,3바이트 문자가 잘리는거 따위는 신경쓸 이유가 없음.
애초에 바이너리 데이터도 hashsum을 만드는데, 자르는 단위가 word가 될 이유가 없지.
나는 글 안보고 word 어쩌고 하길래, 2,3바이트 문자 잘리냐는 얘긴줄 알았는데, 바이트가 쪼개지냐는 얘기였네. 이건 확답을 못하겠다. 내용 다시 자세히 읽어봤는데, 자르는게 더 귀찮아서 안할거 같은데... 1 넣고 7 zero padding하지 않을까? 구현된 라이브러리 봐야 알듯.
최소값->최솟값
난 GG. 역시 봐도봐도 복잡하네. 다만 sha1에서 해당위치에 |= 0x80 을 하는건 발견했다. 448bit data |= 0x80 이러는거 같네. 니가올린 문서에 나와있을거 같은데 문서를 봐바.
그냥 OR로 저 위치 1비트를 를 무조건 1로 만들어버리는거 같은데.
그나저나 멀티바이트 문자열 안깨는 것도 있네. SHA마다 다른가? 아니면 잘못 알았나...?
아, 알거같다. 448bit data |= 0x80 이런게 아니라, 그냥 맨끝에 1비트 붙이는거야. 그러니까 저 1비트는 매 padding블록마다 자르는게 아니라, 모든걸 다 자르고 마지막에 붙이는거. M0 = 448bit data + 64bit(448) // M1 = 64bit data + 1bit(1) + 383bit(0) + 64bit(64) 이렇게 되는거지. |= 발견한거 때문에 계속 ??? 이러고 있다가 본문 다시 읽어보니 알겠네. 그냥 무조건 메시지 맨끝에 1비트 붙이는거야.
소스 찾아보면 반복문 밖에 있는게 이상하다 싶었는데, 이걸 이제서야 알다니. ㅡㅡ;; 그러고보니 저 length도 마지막에 붙이는거 같다. 그러니까 위에 쓴거도 틀렸다. 그러므로 M0 = 512bit data // M1 = 1bit(1) + 447bit(0) + 64bit(512) 이렇게 됨.
매번 블록마다 length 표현을 64비트나 할 이유가 없어.
아이고 l과 1과 I 와 |가 구분이 안되는 폰트라 이상해졌네요 L 이야기인데
감사합니다 매번 뒷 블록에 붙이는게 아니었네요 512로 끊다가 마지막에만 붙이네요